草庐IT

c++ - Clang 与 GCC 与 MSVC 中的 SFINAE 和可见性检查——哪个是正确的?

我已经写了我对is_default_constructible的C++03兼容实现的尝试:templatestructis_default_constructible;templatestructis_default_constructible{protected://Putbasetypedefsheretoavoidpollutionstructtwoc{chara,b;};templatestructtest{typedefchartype;};templatestaticTdeclval();};templatestructis_default_constructible::t

c++ - gcc c++ 命令行错误消息解析器

是否有任何程序可以以漂亮的格式解析和显示gcc生成的c++错误消息。我真的在寻找像less这样的东西,我可以将我的错误输入其中,默认情况下会fold模板参数列表,也许有一些很好的突出显示,以便我的错误实际上是可读的。(是的,这是boost的错,我有如此难以理解的错误,以防你想知道) 最佳答案 STLErrorDecryptor(AKASTLFilt)可以帮助解码它们。我的结果喜忧参半。 关于c++-gccc++命令行错误消息解析器,我们在StackOverflow上找到一个类似的问题:

c++ - undefined reference 在 GCC 下使用 LTO 交叉编译静态库

我正在尝试使用GCC4.9.2为Windows(x86_64-w64-mingw32)交叉编译来自Linux(x86_64-pc-linux-gnu)的应用程序。当构建链接到静态库的目标并使用链接时优化时,对于目标使用的库中的所有符号,我从链接器收到undefinedreference错误。例如,从bar.cpp构建bar.aintbar(void){return42;}并与foo.cpp链接externintbar(void);intmain(int,char**){bar();}使用命令行x86_64-w64-mingw32-g++-flto-ofoo.o-cfoo.cppx86_

c++ - 传递引用阻碍 gcc 消除尾调用

参见BlendingTable::create和BlendingTable::print。两者都具有相同形式的尾递归,但create将优化为循环,而print不会并导致堆栈溢出。向下查看修复程序,这是我从一位gcc开发人员关于我关于此问题的错误报告的提示中得到的。#include#include#include#include#includeclassSystem{public:templatestaticvoidprint(constT&t,constTs&...ts){std::coutstaticvoidprintLine(constTs&...ts){print(ts...,'

c++ - 使用 gcc 写入 Unions

考虑以下类型:structA{intx;};structB{inty;charz;};unionU{Aa;Bb;};还有这个代码片段:Uu;new(&u.b)B;b.y=42;b.z='x';此时,从u.a.x读取是明确定义的行为(并将产生42),因为它在公共(public)初始序列中。写入到u.a.x是未定义的行为。但gcc允许通过union进行类型双关——文档明确允许读取非事件成员,而不管成员顺序如何。gcc是否允许写入非事件成员,甚至是常见的初始序列,或者这在gcc上仍然是未定义的行为吗?也就是说,如果此时我有:voidwrite(A&arg){a.x=17;}write(&u.

c++ - GCC:减少输出中的模板名称

在我的C++代码中,我经常使用模板……这可能是轻描淡写的说法。最终结果是类型名称超过4096个字符,至少可以说观看GCC输出是痛苦的。在GDB或Valgrind等多种调试包中,可以要求不对C++类型进行分解。是否有类似的方法可以强制G++输出仅损坏的类型名称,从而减少所有不必要的输出?澄清由于给出的第一个答案,我发现问题并不明确。考虑以下MWE:templateclassA{public:Tfoo;};templateclassB{};templateclassC{public:voidf(void){this->foo=T(1);this->bar=T(2);}};typedefC>

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没有错误。