草庐IT

c++ - 参数包没有用 ‘...' 扩展——gcc 的另一个可变参数模板错误?

众所周知,gcc对可变参数模板的处理是不完整的(参见示例this和this),但我想知道以下错误是否已知(我在bugzilla找不到它)或者它是否确实是一个错误。本质上,gcc(4.8.1)无法在lambda中扩展参数包:#include#include#includetemplatevoidbar(std::vectorconst&c,Fconst&f,X&&...x){std:for_each(c.begin(),c.end(),[&](constT&t){f(t,std::forward(x)...);});}这导致(即使没有任何实例化)error:parameterpacksn

c++ - clang 和 gcc 中的 Constexpr 复合赋值运算符

我有以下代码:main.cpp#include#includeenumclassFooEnum:uint8_t{Foo1=0,Foo2=1};constexpruint32_t&operator|=(uint32_t&lhs,FooEnumrhs){returnlhs|=1u(rhs);}intmain(){uint32_tbar{0};bar|=FooEnum::Foo1;}所以本质上,|=运算符应该采用枚举并设置位,其位置对应于它的整数值。当在fedora21上用clang++3.5.0编译时,一切正常,但是当用g++4.9.2编译时,它抛出一个错误,说这不是一个常量表达式:mai

c++ - 在不违反严格别名规则的情况下,在现代 GCC/C++ 中使用网络缓冲区的正确方法

该程序-某种老式网络消息传递://Commonheaderforallnetworkmessages.struct__attribute__((packed))MsgHeader{uint32_tmsgType;};//Oneofnetworkmessages.struct__attribute__((packed))Msg1{MsgHeaderheader;uint32_tfield1;};//Networkreceivebuffer.uint8_trxBuffer[MAX_MSG_SIZE];//Receivehandler.Thereceivedmessageisalreadyi

c++ - GCC 生成的程序集

为什么printf函数会导致prologue的变化?C代码_1:#includeintmain(){inta=11;printf("%d",a);}GCC-m32生成一个:.LC0:.string"%d"main:leaecx,[esp+4]//What'spurposeofthisthreeandesp,-16//lines?pushDWORDPTR[ecx-4]//pushebpmovebp,esppushecxsubesp,20//whysub20?movDWORDPTR[ebp-12],11subesp,8pushDWORDPTR[ebp-12]pushOFFSETFLAT:.

c++ - 匿名临时对象和类模板参数推导 - gcc vs clang

考虑以下代码片段:templatestructfoo{foo(T){}};intmain(){foo{0};}g++7愉快地创建了一个foo类型的临时对象,推导出T=int。clang++5和6拒绝编译代码:error:expectedunqualified-idfoo{0};^liveexampleonwandbox这是一个clang错误,还是标准中有什么东西阻止类模板参数推导为未命名的临时对象启动? 最佳答案 Clang错误(#34091)来自[dcl.type.class.deduct]:Aplaceholderforaded

c++ - 为什么 clang 和 gcc 以不同的方式处理具有类内初始化的结构的支撑初始化?

我最近发现了clang和gcc的一个奇怪行为。我有一个结构(MyClass),它对其其中一个成员(active)使用类内初始化:structMyClass{intsomething;boolactive=true;};现在我尝试用大括号初始化这个类。使用clang,我可以决定是否在初始化列表中包含active(MyClassa={42,true};)或不包含(MyClassa={42};).但是使用gcc,我的代码只有在不包含active时才能编译。否则,我将得到以下编译器错误:error:couldnotconvert‘{42,true}’from‘’to‘MyClass’这是一个错

c++ - Clang 不会编译 gcc 会编译的模板特化

Gcc可以正常编译,但Clang(主干)拒绝并显示以下消息::7:8:error:classtemplatepartialspecializationisnotmorespecializedthantheprimarytemplate[-Winvalid-partial-specialization]https://godbolt.org/g/h8rsWCtemplatestructS{};templatestructS{};这段代码是否正确? 最佳答案 这仅在-std=c++17及更高版本中出现。“更专业”的确定需要synthes

c++ - 我应该使用最新的 GCC 版本吗(一般来说,特别是今天)

我想知道使用最新的GCC版本是否安全,或者人们通常会退回几个版本(如果是的话,有多少)。是否存在可以假定为(相对)没有错误的可信版本,或者我可以安全地假定(对于非救生程序)最新的GCC版本可以安全使用吗?编辑:安全-我的意思主要是没有错误,即在执行方面。 最佳答案 如果没有相反的特定要求,我倾向于使用我的(合理最新的)Linux发行版提供的gcc版本。到目前为止,这项政策对我来说效果很好。 关于c++-我应该使用最新的GCC版本吗(一般来说,特别是今天),我们在StackOverflow

c++ - GCC 在要求此引用声明的 constexpr 说明符方面是否正确?

下面的代码不能在GCC5.3.0下编译因为r的声明缺少constexpr说明符。constinti=1;constint&r=i;constexprintj=r;我相信拒绝是正确的。如何使用工作草案N4527证明它? 最佳答案 首先,由于我们使用的是引用,因此不得违反[expr.const]/(2.9)。(2.9.1)适用,但:anid-expressionthatreferstoavariableordatamemberofreferencetypeunlessthereferencehasaprecedinginitializa

C++11/14/17,GCC 7 与 GCC 8 : Name lookup for friend class templates

我想弄清楚以下代码在GCC7中是否有效,但在GCC8.1中无效。代码的作用是:定义(并转发声明)类模板MyGoodFriend(在全局命名空间中)在inner命名空间中定义一个类模板Befriended使MyGoodFriend的所有特化成为Befriended的friend有问题的部分是templatefriendclassMyGoodFriend;我明白问题是什么了。GCC8.1要求我在friend声明中使用完全限定名称::MyGoodFriend-然而,GCC7对MyGoodFriend很满意。这是代码:templateclassMyGoodFriend;namespaceinn