草庐IT

c++ - 在通用 lambda 中使用 `if constexpr` 访问成员类型需要两个分支的格式都正确 - gcc 与 clang

考虑两个具有不同成员类型别名的struct:structfoo{usingx=int;};structbar{usingy=float;};在template上下文中给定一个T,我想获得T::x或T::y取决于T是什么:templateautos(){autol=[](autop){ifconstexpr(p){returntypenameT::x{};}else{returntypenameT::y{};}};returnl(std::is_same{});}intmain(){s();}g++编译上面的代码,而clang++产生这个错误:error:notypenamed'y'in

c++ - 默认参数,gcc vs clang

代码如下:structFoo{Foo(constchar*);};Foo::Foo(constchar*str=0){}VS2013和gcc4.8.0接受这样的代码,而clang3.3拒绝这样的代码:error:additionofdefaultargumentonredeclarationmakesthisconstructoradefaultconstructor从标准(C++03和C++11)的角度来看,谁是正确的?注意:我也喜欢clang的选择,但是我要向gcc和visualstudio报告bug,如果从标准的角度来看这是不正确的,这有助于说服编译器的开发者解决这个问题。GCC

c++ - 默认参数,gcc vs clang

代码如下:structFoo{Foo(constchar*);};Foo::Foo(constchar*str=0){}VS2013和gcc4.8.0接受这样的代码,而clang3.3拒绝这样的代码:error:additionofdefaultargumentonredeclarationmakesthisconstructoradefaultconstructor从标准(C++03和C++11)的角度来看,谁是正确的?注意:我也喜欢clang的选择,但是我要向gcc和visualstudio报告bug,如果从标准的角度来看这是不正确的,这有助于说服编译器的开发者解决这个问题。GCC

c++ - GCC优化isnan(x)是否可行|| isnan(y) 变成 isunordered(x, y)?

这是我的代码:intf(doublex,doubley){returnstd::isnan(x)||std::isnan(y);}如果您使用C而不是C++,只需将std::替换为__builtin_(不要简单地删除std::,原因如下:WhydoesGCCimplementisnan()moreefficientlyforC++thanC?)。这是程序集:ucomisd%xmm0,%xmm0;setparityflagifxisNANsetp%dl;copyparityflagto%edxucomisd%xmm1,%xmm1;setparityflagifyisNANsetp%al;c

c++ - GCC优化isnan(x)是否可行|| isnan(y) 变成 isunordered(x, y)?

这是我的代码:intf(doublex,doubley){returnstd::isnan(x)||std::isnan(y);}如果您使用C而不是C++,只需将std::替换为__builtin_(不要简单地删除std::,原因如下:WhydoesGCCimplementisnan()moreefficientlyforC++thanC?)。这是程序集:ucomisd%xmm0,%xmm0;setparityflagifxisNANsetp%dl;copyparityflagto%edxucomisd%xmm1,%xmm1;setparityflagifyisNANsetp%al;c

c++ - gcc 编译选项 std=c++1y 和 std=c++14 的区别

我安装了gcc4.9.2。我使用以下命令编译了程序:/root/gcc-4.9.2/bin/g++-std=c++1ytesting.cpp请注意,除了选项-std=c++1y之外,还有另一个选项-std=c++14。编译器会以相同的方式工作并为两个选项生成完全相同的可执行文件吗? 最佳答案 C++14是最新的ISO标准,除非你需要一些gcc非标准特性,否则应该使用它。c++1y是在c++14标准完成之前用来指代它的名称,因此它很可能遵循标准草案,但不是实际标准本身。两者之间可能存在一些细微差别,但c++14是ISO标准。简而言之,

c++ - gcc 编译选项 std=c++1y 和 std=c++14 的区别

我安装了gcc4.9.2。我使用以下命令编译了程序:/root/gcc-4.9.2/bin/g++-std=c++1ytesting.cpp请注意,除了选项-std=c++1y之外,还有另一个选项-std=c++14。编译器会以相同的方式工作并为两个选项生成完全相同的可执行文件吗? 最佳答案 C++14是最新的ISO标准,除非你需要一些gcc非标准特性,否则应该使用它。c++1y是在c++14标准完成之前用来指代它的名称,因此它很可能遵循标准草案,但不是实际标准本身。两者之间可能存在一些细微差别,但c++14是ISO标准。简而言之,

c++ - 我可以忽略 gcc 警告 : ‘Foo::m_bar’ should be initialized in the member initialization list [-Weffc++]

structBar{Bar(){}};structFoo{Foo()=default;Barm_bar;};intmain(){Foofoo;}当使用C++11default关键字和gcc警告-Weffc++时,gcc输出:warning:‘Foo::m_bar’shouldbeinitializedinthememberinitializationlist[-Weffc++]忽略此警告是否安全?我应该向gcc提交错误吗? 最佳答案 您可以忽略或抑制警告。这是对有效C++指南之一的误解。该指南说更喜欢初始化而不是赋值,但在您的示例中

c++ - 我可以忽略 gcc 警告 : ‘Foo::m_bar’ should be initialized in the member initialization list [-Weffc++]

structBar{Bar(){}};structFoo{Foo()=default;Barm_bar;};intmain(){Foofoo;}当使用C++11default关键字和gcc警告-Weffc++时,gcc输出:warning:‘Foo::m_bar’shouldbeinitializedinthememberinitializationlist[-Weffc++]忽略此警告是否安全?我应该向gcc提交错误吗? 最佳答案 您可以忽略或抑制警告。这是对有效C++指南之一的误解。该指南说更喜欢初始化而不是赋值,但在您的示例中

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

我来自Linux世界,知道很多关于维护用C++语言编写的动态库API的向后二进制兼容性(BC)的文章。其中之一是"Policies/BinaryCompatibilityIssuesWithC++"基于ItaniumC++ABI,由GCC编译器使用。但我找不到与MicrosoftC++编译器(来自MSVC)类似的东西。我了解大多数技术都适用于MSC++编译器,我想发现与ABI差异(v-table布局、修改等)相关的编译器特定问题所以,我的问题如下:在维护BC时,您知道MSC++和GCC编译器之间的区别吗?在哪里可以找到有关MSC++ABI或在Windows中维护APIBC的信息?任何相