草庐IT

c++ - 从右值引用到基的构造函数 - 可行(gcc)或不可行(clang) - 谁是对的

最近有一个编译问题,用这个片段说明:structBase{};templatestructA:Base{A(){}A(Base&&){}};Afoo(){Av;returnv;}intmain(){autod=foo();return0;}Gcc说没问题,但clang不同意并说“候选构造函数不可行:对于第一个参数A(Base&&){},没有已知的从‘A’到‘Base&&’的转换”,请自行查看:https://godbolt.org/z/Y7mwnU有哪位好心的读者能够提供一些标准术语来支持这两种观点吗? 最佳答案 clang在这里是

c++ - 为什么这个动态库加载代码用gcc可以用?

背景:我发现自己肩负着将C++GNU/Linux应用程序移植到Windows的艰巨任务。该应用程序所做的其中一件事是在特定路径上搜索共享库,然后使用posixdlopen()和dlsym()调用从中动态加载类。我们有一个很好的理由以这种方式加载,我不会在这里讨论。问题:要动态发现C++编译器使用dlsym()或GetProcAddress()生成的符号,必须使用extern"C"链接block对它们进行整理。例如:#include#includeusingstd::list;usingstd::string;extern"C"{listget_list(){listmyList;myL

c++ - GCC 4.4.1 是否因不接受 ctor-initializer 中的注入(inject)类名而出现错误?

GCC4.4.1拒绝在ctor-initializer中找到我的injected-class-name:templatestructBase{Base(intx){}};structDerived:Base{Derived():Base(2){}};intmain(){Derivedd;}test2.cpp:Inconstructor"Derived::Derived()":test2.cpp:9:error:class"Derived"doesnothaveanyfieldnamed"Base"test2.cpp:9:error:nomatchingfunctionforcallto

c++ - gcc 不接受默认模板参数中的包扩展

以下代码使用clang编译成功,但gcc失败:structfn{templatestaticconstexprboolcall(Args...){returntrue;}};templatestaticconstexprboolf=false;template...)>voidhoge(){}intmain(){}gcc5.1.0(-Wall-Wextra-std=c++14-pedantic)说prog.cc:10:52:error:expansionpattern'f'containsnoargumentpackstemplate...)>clang3.6.0和3.5.0没有错误。

c++ - 引用 this 指针 : GCC vs clang

这是these的后续questions.考虑以下代码:structA{private:A*const&this_ref{this};};intmain(){Aa{};(void)a;}如果使用-Wextra编译,两者都是GCCv6.2和clangv3.9显示警告。无论如何,在下面显示的稍作修改的版本中,它们的行为有所不同:structA{A*const&this_ref{this};};intmain(){Aa{};(void)a;}在这种情况下GCC没有给出任何警告,clang给出与上一个示例中返回的警告相同的警告。警告几乎相同。它遵循来自clang的那个:3:warning:bin

c++ - clang 与 gcc : different code for volatile access

考虑这个例子:volatileunsignedintx;unsignedinty;voidf(){x/=2;}voidg(){y/=2;}当使用-Os编译时,clang-6.0在x64上为f和g生成相同的shrl(%rip)指令模式(见https://godbolt.org/g/hUPprL),而gcc-7.3为f()生成这个(见https://godbolt.org/g/vMcKVV):mov0x200b67(%rip),%eax#601034shr%eaxmov%eax,0x200b5f(%rip)#601034这只是一个错过的优化,还是gcc拒绝shrl(%rip)的理由?如果访

c++ - gcc 4.2 编译器 (Mac OSX) : fpu_control. h: 没有那个文件或目录的新手问题

我正在尝试用c/c++编译程序,但收到错误消息:fpu_control.h:没有那个文件或目录从谷歌,我发现这个问题是关于浮点精度的处理方式。我读到并非所有gcc发行版都包含fpu_control.h。这是我唯一能找到的东西。我进行了广泛的搜索,但找不到任何地方可以下载此fpu_control.h。谁能帮忙?谢谢大家 最佳答案 Apple不支持设置FPU标志,并且doingsoisn'tneeded.原因是theydon'tevenusethei387coprocessorforfloatanddouble,butSSE.最后一个引

c++ - 如何在 GCC 上创建 va_list?

我正在尝试转换一些代码,以便它也能在gcc上编译(现在,它只能在MSVC上编译)。我遇到的代码是伪格式化函数,它接受格式字符串和零个或多个参数作为输入(constchar*format,...)。然后它将处理一些占位符消耗一些参数,并将其余部分与动态生成的新va_list一起传递给vsprintf。这是生成新va_list的实际代码:char*new_args=(char*)malloc(sum);char*n=new_args;for(inti=0;i在我的辩护中,我没有也永远不会编写这段代码。事实上,我认为这是我一生中见过的最骇人听闻的事情之一。但是,这个函数非常复杂,非常古老,而

c++ - Make/gcc 神秘错误 2 : how to have more information?

我有一个使用Makefile编译的C++项目,有时当(我的猜测)缺少一些包含时,我会收到一条神秘的“错误2”消息,并且make进程停止。我怀疑缺少包含,因为这是我包含一个不存在的头文件时第三次发生这种情况。看起来像这样:----Buildtmp/foo.o--------Buildtmp/bar.o--------Buildtmp/toto.o--------Buildtmp/tata.o----make:***[build_Project]Error2这让我抓狂,因为即使使用冗长的命令(显示每个g++调用的地方),我也看不到任何东西。我原以为这家伙会抛出一些错误消息,例如“找不到he

c++ - 将 'using' 指令与部分重载 : gcc feature or intel bug? 相结合

我希望将一组用C++编写的库与英特尔编译器一起使用。我附上了演示问题的示例代码。库中有很多地方使用了“using”指令与部分重载的组合(例如,我想使用基类中的foo(void)方法,但在派生类中重新实现第二个版本fofoo).gcc没有问题,但intel有。#includetemplatestructInterface{staticconstFf=10;};templatestructBase:publicInterface{voidfoo(void){std::coutvoidfoo(Interface&ii){std::coutstructDerived:publicBase{//