草庐IT

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

c++ - 无法使此代码在 MSVC 2015 和 GCC 7.3 之间交叉编译

当我为我的项目编写代码时,我发现了一个非常奇怪的情况,我的C++11代码无法在GCC7.3和之间交叉编译>MSVC2015。案例基本上是这样的://.HfiletemplatestructOuter{Xx={};templatestructInner{Yy={};Inner&operator++();};};//.INLfiletemplatetemplateinlineOuter::Inner&Outer::Inner::operator++(){++y;return*this;}//.CPPfile#includeintmain(){Outer::Innera;++a;std::c

C++ GCC4.4 警告 : array subscript is above array bounds

我最近升级到GCC4.4(MinGWTDM构建),现在以下代码会产生这些警告:Inmemberfunction'voidConsole::print(conststd::string&)':warning:arraysubscriptisabovearraybounds代码如下:voidConsole::print(conststd::string&str){std::stringnewLine(str);if(newLine.size()>MAX_LINE_LENGTH){sf::Uint32stringSize=newLine.size();for(sf::Uint32insert

c++ - 如何更新到 mingw-gcc 4.8.2?

我想在c++11中使用正则表达式,gcc4.8.2支持它。但是MinGW安装程序最多只支持gcc4.8.1。我怎样才能将它更新到gcc4.8.2? 最佳答案 您可以自己手动安装。4.8.2availablehere有一个MinGW-w64发行版.你需要7zip提取文件内容。将其解压缩到您选择的位置后,只需将bin子目录从那里添加到您的环境path即可。例如,如果您将工具链提取到x:\mingw32-4.8.2中,则使用添加x:\mingw32-4.8.2\bin>setxpath"%path%;x:\mingw32-4.8.2\bi

c++ - 将 C++11 regexp 与 gcc 4.8.2 一起使用时出现奇怪的结果(但适用于 Boost regexp)

这个问题在这里已经有了答案:Isgcc4.8orearlierbuggyaboutregularexpressions?(3个答案)关闭8年前。我尝试使用C++11的正则表达式,但即使在简单的示例中也失败了。从外面看,它似乎只是比较字符串,例如:std::regex_match(std::string{""},std::regex{"a?"})//false(???)std::regex_match(std::string{"a?"},std::regex{"a?"})//true(???)相比之下,Boost的正则表达式库的行为符合我的预期:boost::regex_match(st