草庐IT

c++ - g++ 和 clang++ 推断函数模板返回类型的不同行为

另一个“g++和clang++之间谁是正确的?”C++标准专家的问题。下面的程序#includevoidfoo(intv){std::coutvoidbar(Tv,R(*fn)(T)){fn(v);}intmain(){bar(1,foo);}使用g++(6.3.0,但根据Wandbox也使用8.0.0)编译并运行,但是使用clang++(根据Wandbox,3.9.1,也使用6.0.0)编译它,我得到以下错误tmp_002-11,14,gcc,clang.cpp:29:4:error:nomatchingfunctionforcallto'bar'{bar(1,foo);}^~~tm

c++ - G++错误地破坏了静态变量的顺序

我有以下尝试实现通用单例的类。structBaseObject{virtual~BaseObject(){}};class_helper{private:templatefriendclassSingleton;set_s;static_helper&_get(){static_helpert;returnt;}_helper(){cout::Instance()returnsauniqueinstanceoffootemplateclassSingleton:virtualprivateT{public:staticT&Instance(){staticSingleton_T;ret

C++ std::vector initializer_list 重载歧义 (g++/clang++)

考虑以下代码:#include#defineBROKENclassVar{public:#ifdefBROKENtemplateVar(Tx):value(x){}#elseVar(intx):value(x){}#endifintvalue;};classClass{public:Class(std::vectorarg):v{arg}{}std::vectorv;};无论BROKEN是否被定义,Clang++(7.0.1)编译它没有错误,但是如果BROKEN被定义,g++(8.2.1)会引发错误:main.cpp:9:20:error:cannotconvert‘std::vect

c++ - g++ 在不使用 -Wconversion 的情况下将 double/float 转换为无符号整数时发出警告

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:g++-Wallnotwarningaboutdouble->intcast根据问题here,从double/float到无符号整数的直接转换是不可移植的。我发现我的代码中有一些情况会发生这种情况,如果发生这种情况,我想告诉g++警告我,但我找不到这样的选项。有谁知道是否可以选择这样做?注意:我确实看到了-Wconversion,但它也会警告我不关心的所有其他类型的转换(比如将int转换为unsignedint,根据标准这是可移植的)。编辑:这是我希望看到警告的代码示例:doubledblNumber=-23

c++ - g++ c++17 类模板参数推导在非常特殊的情况下不起作用

我有以下代码:templateclasslit{public:lit(Tl):val(l){}Tval;};templateclasscat{public:cat(litconst&a,litconst&b):a(a),b(b){}litconst&a;litconst&b;};templatecatoperator+(litconst&a,litconst&b){returncat(a,b);}intmain(){autor1=cat((lit('b')),lit('d'));//compilesautor2=(lit('b'))+lit('d');//doesn'tcompilea

c++ - G++ 编译统计

我想知道是否有任何方法可以从GCC/G++编译过程中收集统计信息。整个过程中编译的行数、编译总时间、错误/警告数、编译对象的数量/大小等指标。我想制作一个脚本(可能是用python编写的)来生成每日、每周和每月的统计信息。有什么想法吗?谢谢 最佳答案 我知道一个,它叫Cdash它是一个更大、更理想的套件的一部分,该套件实际上包括Cmake、Ctest和Cpack。This对你来说可能是一个有趣的视频 关于c++-G++编译统计,我们在StackOverflow上找到一个类似的问题:

c++ - 在 OSX 10.9.1 上使用 g++ 编译时出错 : unknown type name '__darwin_wctype_t'

在OSX10.9.1上使用g++从命令行编译基本代码(我附加了一个helloworld作为示例)时#includeintmain(){std::cout我用命令编译:g++hello.cc-ohw这会生成以下错误消息:Infileincludedfromhello.cc:1:Infileincludedfrom/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iostream:38:Infileincludedfrom/Applicat

c++ - 自动模板参数 : g++ 7. 3 vs clang++ 6.0 : Which compiler is correct?

对于这个代码示例,两个编译器会产生不同的结果。Clang生成两种不同的类型。G++对fu和fi使用相同的类型。哪个符合标准?#includetemplatestructfoo{decltype(IVAL)x=-IVAL;};intmain(){foofu;foofi;std::coutg++-7.3输出:42949672864294967286clang-6.0输出:-104294967286 最佳答案 gcc在这里是错误的,这显然是两种不同的类型。并确认-此错误已在gcc8.0.1中修复Samplecode

c++ - 模板别名冲突类型。 g++ 编译成功而 clang 失败

我遇到了一个非常奇怪的编译器错误。由于某种原因,发布的代码确实可以使用g++(7.3.0)正确编译,而clang(7.0.0)失败:../TemplateAlias/main.cpp:64:9:error:nomatchingfunctionforcallto'freeFunc'freeFunc(newFunc,dummyField);^~~~~~~~../TemplateAlias/main.cpp:73:12:note:ininstantiationofmemberfunction'Helper>::func'requestedherehelper.func();^../Templ

c++ - 如何强制 g++ 只编译 c++11 标准?

std::vector::emplace_back是available仅从C++14开始。但是,对于我的g++5.4.0,即使我指定了-std=c++11,它也可以正常编译。.当我用g++4.8.4编译相同的代码时,它失败了。有没有办法说服g++严格检查所选标准?注意:我已经使用了-pedantic-Wextra-Wall.示例test.cpp:#includeintmain(){std::vectorv;v.emplace_back(true);return0;}用g++-std=c++11test.cpp-otest编译.使用g++5.4.0编译正常,g++4.8.4触发:test