草庐IT

non-void

全部标签

c++ - "Missing non-virtual thunks"和继承顺序

我们在C++中有一个大型代码库,在进行了一些小的重构(添加了一个类并重写了一些相关方法)之后,我们开始在GCC3和4上遇到链接器错误。链接器错误特别是“缺少对非虚拟的引用”thunks”在我们的大型SDK中子类化的小示例程序中。除了一些似乎已解决的旧GCC错误外,在网上搜索并没有给出很多提示。问题的属性好像是:GCC3.4.6&4.3.3使用-O2优化多重继承,包括偶尔的虚拟继承。改变继承顺序,比如说,Foo类:公共(public)A,公共(public)B{}到Foo类:公共(public)B,公共(public)A{}在缺少thunk的类上“修复”了问题。虚继承只出现在一个单一的、

c++ - 我可以举一个现实生活中的例子,其中通过 void* 进行强制转换而 reinterpret_cast 无效吗?

有一组关于交叉转换的问题(从T1*转换为不相关的T2*),例如this和this.答案通常是这样的:reinterpret_cast是实现定义的,转换为void*后跟static_cast是明确定义的。然而,我还没有看到使用reinterpret_cast时可能出错的任何真实示例。通过void*进行强制转换而reinterpret_cast无效的真实示例有哪些? 最佳答案 real-lifeexampleswherecastingthroughvoid*worksandreinterpret_castdoesn't如果我将这句话解释

c++ - 运算符优先级(bool 之前是否为 void*?)

回答thisquestion时我做了一些让我很困惑的研究。我注意到两个成功打开的ifstreams不相等,但两个失败的ifstreams相等。起初我检查了cplusplus.com。operator!返回badbit和failbit的状态。我认为与此相反的仍然是返回这两位的状态,但是翻转了。错误,因为两次成功调用不相等。然后我认为它是某个地方的operatorbool会返回一些东西。所以我试图从ifstream回溯并找到istream::operatorbool(),它正在返回_Ok。但还是错了,这似乎根本没有被调用(也不可能,因为两次成功的调用仍然不相等)。所以我改变了方法并检查了V

c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha

c++ - gcc-4.9.2 : non-type template parameter

我在gcc-4.9.2上有一个奇怪的编译错误,相同的代码在其他编译器上工作,比如gcc-4.8或我能找到的任何clang。问题与non-typetemplate-arguments有关.所以考虑一下:#include#includeinttemplateParam;templatestructTestTemplate{intvalue(){}};templateintTestTemplate::value(){returntemplateParam;}TestTemplatetestVariable;intmain(){std::cout我在gcc-4.9.2中遇到以下错误:prog.

c++ - extern "C"static void* 函数

在阅读了extern和static之后,我很困惑地遇到了具有以下行的代码:extern"C"staticvoid*foo(int*a){returnfoo1(a);}为什么这不会产生任何错误? 最佳答案 以下内容也编译并执行与您的行相同的操作:extern"C"{staticvoid*foo(int*a){returnfoo1(a);}}static意味着foo()将只在文件范围内可用,当它出现时它会覆盖extern"C"到联动。通常,extern"C"会影响链接器在导出时使用的函数的名称,以便在链接整个程序时可以从其他目标文件调用

c++ - constexpr 与 std::array - "Non-type template argument is not a constant expression"

这个问题在这里已经有了答案:Errorusingaconstexprasatemplateparameterwithinthesameclass(2个答案)关闭9年前。我正在尝试实现以下内容:#include#includeclassClass2{};classClass1{public:staticconstexpruint8_tGetMax(){return5;}staticconstexpruint8_tGetMin(){return0;}staticconstexpruint8_tGetCount(){returnGetMax()-GetMin()+1;}private:std

c++ - 为什么 push_back 签名是 void push_back (const value_type& val) 而不是 void push_back (value_type val)?

这个问题在这里已经有了答案:Passingbyvaluevsconst&and&&overloads(3个答案)关闭8年前。为什么push_back的函数签名如下?voidpush_back(constvalue_type&val);传递的值被复制到容器中,为什么不直接复制到参数列表中呢?voidpush_back(value_typeval);

c++ - 函数返回 void 的无序函数评估

C和C++中是否有一种方法可以使返回void的函数以未指定的顺序求值?我知道函数参数以未指定的顺序求值,因此对于不返回void的函数,这可用于以未指定的顺序求值这些函数:#includeinthi(void){puts("hi");return0;}intbye(void){puts("bye");return0;}intmoo(void){puts("moo");return0;}voiddummy(inta,intb,intc){}intmain(void){dummy(hi(),bye(),moo());}由符合规范的编译器编译的合法C和C++代码可以按任何顺序打印hi、bye和

c++ - std::promise<void> 抛出未知错误,除非调用 sleep

我有这个代码:#include#includeintmain(){std::promisep;p.set_value();p.get_future().get();return0;}用gcc编译后抛出std::system_error:$g++-ofoofoo.cpp-std=c++11-lpthread$./footerminatecalledafterthrowinganinstanceof'std::system_error'what():Unknownerror-1奇怪的是,在创建promise之前添加零秒sleep,防止了异常:intmain(){std::this_thre