草庐IT

c++ - 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc

以下代码:#includetemplateautof(){}intmain(){std::array{f};}使用clang7.0编译,但使用gcc8.2失败并显示消息prog.cc:Infunction'intmain()':prog.cc:7:20:error:classtemplateargumentdeductionfailed:std::array{f};^prog.cc:7:20:error:nomatchingfunctionforcallto'array()'Infileincludedfromprog.cc:1:/opt/wandbox/gcc-8.2.0/inclu

c++ - GCC 是否准备好用于 C++14 生产代码?

在thiswebpage,GCC对ISOC++14标准的支持定义为“实验性”。因为我想在我的C++代码中使用C++14对C++11的一些改进(例如std::make_unique和通用lambdas),我是否可以安全地使用GCC4.9的-std=c++14选项用于生产代码,或者当前的GCC/C++14状态有点像“测试版”,因此GCC/C++14还没有准备好生产代码? 最佳答案 iscurrentGCC/C++14statuskindoflike"beta"andsoGCC/C++14notreadyforproductioncode

c++ - Visual C++ 和 gcc 之间从 std::isblank 返回的结果不一致。哪一个是错误的?

在Windows上的VisualC++和Ubuntu上的gcc之间调用std::isblank时,我看到了不一致的行为,我想知道哪个是正确的。在两个编译器上——当默认语言环境是“C”语言环境时——以下调用返回falsestd::isblank('\n');这是我所期望的。它与我在cppreference.com上看到的一致InthedefaultClocale,onlyspace(0x20)andhorizontaltab(0x09)areclassifiedasblankcharacters.但是对于C++,我们还有采用std::locale参数的版本std::isblank('\n

c++ - gcc 如何优化这个循环?

所以我遇到了一些奇怪的行为,我将其简化为以下最小示例:#include#includeintmain(){std::vectorvec;for(inti=0;i使用gcc7.3.0编译时使用命令c++-Wall-O2program.cpp-oprogram我没有收到任何警告。运行该程序会产生以下输出:01002003004005006007008009001000110012001300[snipseveralthousandlinesofoutput]107374160010737417001073741800terminatecalledafterthrowinganinstanc

c++ - 具有未使用的引用参数的 constexpr 函数——gcc vs clang

考虑以下代码:templatevoidf(T){}templateconstexprintk(T&){return0;}intmain(){constexprautoi=1;f([&i]{f(0);});}clang++(trunk)编译它。g++(trunk)失败并出现以下错误::Inlambdafunction::11:19:error:nomatchingfunctionforcallto'f((*&i))>(int)'11|f(0);|^:1:35:note:candidate:'templatevoidf(T)'1|templatevoidf(T){}|^:1:35:note

c++ - 与 gcc 和 g++ 的链接有什么区别?

gcc和g++的链接过程有什么区别吗?我有一个很大的C项目,我只是将部分代码转换为C++。该代码尚未使用标准C++库,因此暂时不需要-llibstdc++。 最佳答案 主要区别在于(假设文件被检测为C++)g++设置了与C++标准库链接所需的标志。它还可以设置异常处理。我不会依赖这样一个事实,即仅仅因为您的应用程序不使用标准库,当编译为C++时就不需要它(例如默认异常处理程序)。编辑:正如评论中所指出的那样,您将遇到静态对象的任何构造函数(确实有效)以及无法获得虚函数表的问题(因此,如果您使用的是C++的这些功能,您仍然需要链接那个

c++ - GCC:在需要复制构造函数时实例化模板构造函数

在下面的例子中,GCC>=4.7实例化模板构造函数(您可以通过阅读错误消息来观察),尽管只需要隐式生成的复制构造函数。#include//'ambiguous'isambiguousfor'ambiguous'templatestructambiguous:std::false_type{};templatestructambiguous:std::true_type{};templatestructambiguous:std::true_type{};//quantitytemplateclassquantity{public:quantity()=default;//Copy-co

c++ - 这段编译良好的荒谬代码是 Clang 和 GCC 中的错误吗?

这个问题在这里已经有了答案:Injectedclassnamecompilerdiscrepancy(3个答案)关闭6年前。我今天在研究模板,看看能否让编译器从其内部类之一推断出外部类的类型。我没有找到我的解决方案(我怀疑这是不可能的),但是在尝试修复错误时我遇到了非常奇怪的行为,我将其简化为以下代码片段。structA{structB{};templatestructEverythingIsFine{usingOuter=T;usingInner=typenameT::B::B::B::B::B::B;};usingItWillBeOkay=EverythingIsFine;//Pr

c++ - 解析为 void(void) 的模板签名被 gcc 拒绝;这是有效的 C++ 吗?

我认为这段代码是有效的C++。MSVC同意,但gcc似乎不同意。MSVC和我错了吗?(或者我应该输入稍微不同的内容吗?)#include#include#include#includetemplatestructS{templatevoidf(std::functionfn){autop=&fn;++p;}templatevoidg(std::functionfn){autop=&fn;++p;}};voidf(){Ss;autop=&s;++p;}intmain(){f();}错误信息::Ininstantiationof'structS'::26:11:requiredfromhe

c++ - GCC 的 decltype(auto) 不符合标准?

我尝试使用不同的选项在GCC8.2下编译此C++代码,它总是成功,不产生任何警告并输出true:int&&a=123;decltype(auto)b=a;std::cout::value;同时,相同的代码不会在Clang中编译,如果我对标准的理解是正确的,那就是符合标准的行为。decltype上的cppreference:Iftheargumentisanunparenthesizedid-expressionoranunparenthesizedclassmemberaccessexpression,thendecltypeyieldsthetypeoftheentitynamedb