草庐IT

c++ - GCC 无法使用 init-capture 捕获 'this' 指向模板类型的指针

模板类可以在lambda中捕获自己的this指针:templateclassFoo{public:voidfoo(void){}autogetCallableFoo(void){return[this](){this->foo();};}};可以使用以下代码测试这个和所有其他Foo示例:intmain(){Foof;autocallable=f.getCallableFoo();callable();}但是,如果改为使用init-capture,则这不再适用于GCC:autogetCallableFoo(void){return[ptr=this](){ptr->foo();};}错误

c++ - 如何在 clang 中选择特定的 gcc-toolchain?

Clang自动选择版本最高的gcc-version:$clang++-vmain.cppclangversion3.8.1-12(tags/RELEASE_381/final)Target:x86_64-pc-linux-gnuThreadmodel:posixInstalledDir:/usr/binFoundcandidateGCCinstallation:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9FoundcandidateGCCinstallation:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.4Fo

c++ - clang 和 gcc 为相同的代码生成不同的逻辑。哪个是对的?

我发现gcc-8和clang-6产生的逻辑有差异。这发生在一个真实的代码库中,当我使用clang开发时,我使用gcc部署。请告知哪个编译器有错误,以便我可以适本地提交错误。概要A可隐式转换为BA可从A构造(复制/移动)和std::initializer_list.初始化A时来自A&&:clang选择移动构造函数gcc选择initializer_list构造函数。现场演示:https://coliru.stacked-crooked.com/a/bc50bd8f040d6476MCVE#include#include#includestructthing;structthing_ref{

c++ - 如何确保 lrint 在 gcc 中内联?

在阅读了该主题之后,来自大量来源的大量证据表明,在Intel上使用标准C或C++强制转换从float转换为整数非常慢。为了满足ANSI/ISO规范,IntelCPU需要执行大量指令,包括切换FPU硬件舍入模式所需的指令。各种文档中描述了许多解决方法,但最简洁和最便携的似乎是添加到C99和C++0x标准的lrint()调用。许多文档说编译器应该在启用优化时内联扩展这些函数,从而生成比传统强制转换或函数调用更快的代码。我什至找到了对gcc功能跟踪包的引用,以将此内联扩展添加到gcc优化器,但在我自己的性能测试中,我无法让它工作。我所有的尝试都表明lrint的性能比简单的C或C++样式转换要

c++ - 在折叠表达式中使用 lambda 时出现 "Uninitialized captured reference"错误 - clang 与 gcc

考虑以下代码:templateautofold_left(F&&f,X0&&x0,X1&&x1,Xs&&...xs){autoacc=f(x0,x1);return([&](autoy){returnacc=f(acc,y);}(xs),...);}conststd::stringa{"a"},b{"b"},c{"c"},d{"d"},e{"e"};constautocat=[](autox,autoy){return"("+x+","+y+")";};调用和打印fold_left(cat,a,b,c)时,g++7和clang++5都输出:((a,b),c)调用和打印fold_left

c++ - 有没有一种简单的方法可以让 gcc 省略 crtbegin.o/crtend.o?

除了使用-nostdlib和自己链接crt1.o-lc-lgcc之外,还有什么简单的方法可以防止gcc链接crtbegin[S].o和crtend[S].o?这些文件不是那么大,但我正在制作小型二进制文件,并且想删除C程序不需要的无用C++支持代码。(假设gcc甚至为C程序链接它们,以防您使用具有全局对象变量的C++库。我会让每个人都不会提示它应该如何在引用全局对象的任何地方生成安全的一次性初始化调用C++模块,而不是在main...)之前初始化全局对象我不反对破解gccspecs文件以使C++支持文件的链接以某某为条件,但我不确定该怎么做。也许已经有一个不错的方法?

c++ - C++ (GCC) 中的四倍精度

就在最近,GCC4.6.0与libquadmath一起发布了。.不幸的是,GNU支持Fortran,但不支持C或C++(包含的只是.so)。我还没有找到在C++中使用这些新功能的方法,但是,GNUC确实支持__float128类型以保证四倍精度float。GNUC似乎不支持libquadmath中的数学函数。,例如fabsq(绝对值,q是quad的后缀)。有什么方法可以让这些函数在C++中运行,或者是否有一些替代库可以用于带有__float128的数学函数?在GCC中获得四精度float的最佳方法是什么?现在,我可以对它们进行加减乘乘,但这对我来说毫无用处,因为我无法将它们转换为字符串

c++ - "pure virtual function called"在 gcc 4.4 上,但不在新版本或 clang 3.4 上

我有一个MCVE,它在使用g++4.4.7版编译时在我的一些机器上崩溃,但可以在clang++3.4.2版和g++6.3版中使用。我想知道它是来自未定义的行为还是来自这个古老版本的gcc的实际错误。代码#includeclassBaseType{public:BaseType():_present(false){}virtual~BaseType(){}virtualvoidclear(){}virtualvoidsetString(constchar*value,constchar*fieldName){_present=(*value!='\0');}protected:virtu

c++ - 使用声明的命名空间(GCC/VS2010 中的错误)?

namespaceA{inti;}intmain(){usingA::i;usingA::i;}VS2010-编译良好gcc(ideone)-编译良好Comeau-给出错误“ComeauTest.c”,第10行:错误:“i”已在当前范围内声明使用A::i;"$7.3.3/8-"Ausing-declarationisadeclarationandcanthereforebeusedrepeatedlywhere(andonlywhere)multipledeclarationsareallowed."上面的例子表明代码确实格式错误。那么,这是GCC和VS2010中的错误吗?编辑2:删除

c++ - GCC 编译器是否应该对这个涉及 [[fallthrough]] 属性的格式错误的 C++ 代码进行诊断?

我在GCC编译器版本7.1.0上测试C++17功能。这与fallthrough属性有关,以下示例(liveexample)改编自在线CPP引用here#include"iostream"usingnamespacestd;intf(intn){switch(n){case1:case2:n=n+20;[[fallthrough]];case3://nowarningonfallthroughn=n+30;case4://compilermaywarnonfallthrough[[fallthrough]];//ill­formed,notbeforeacaselabel//n=n+40