static-initialization
全部标签 gcc(4.8)或icc(14.0)是否有任何模式或其他非标准机制可以保证静态局部变量的早期安全构造?为了在运行时可控的粗略分析,我需要一个本地静态对象引用的全局集合。标准的延迟构造(以及处理锁定或冗余的thread_local集合)让我很受伤,在开始时拥有完整的点列表将非常有利。有希望实现吗?#include#include//Reallywanttobuildthislistbeforemain()started!structProfilePoint;staticstd::dequepps;//Costlyconstruction,butonlyeverwithliteral/co
在模板函数中,我目前有以下行:staticconstunsignedcharalphabet[17]=(Uppercase)?("0123456789ABCDEF"):("0123456789abcdef");其中Uppercase是模板参数。使用-pedanticgcc告诉我:warning:array'alphabet'initializedbyparenthesizedstringliteral'("0123456789abcdef")'如何摆脱该消息(我希望alphabet位于堆栈中)? 最佳答案 使代码明确有效的最简单方法
在工作草案中http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdf23.3.2它说Anarrayisanaggregate(8.5.1)thatcanbeinitializedwiththesyntaxarraya={initializer-list};我会通过arraya={initializer-list};是正确的,有人可以解释一下这种奇怪的语法吗? 最佳答案 草稿有误。C++11标准的最终版本有arraya如您所料。
这个问题在这里已经有了答案:C++ArrayInitializersWarnings(2个答案)关闭8年前。我刚刚在我的机器上安装了最新版本的cygwin和eclipseluna。它工作正常,我能够运行我的项目。但是,当我构建它们时,我收到了我不明白的警告。例如,这是我从“c++Primer”一书的网站上获得的头文件“Sales_item.h”的警告:warning:defaultedanddeletedfunctionsonlyavailablewith-std=c++11or-std=gnu++11[enabledbydefault]Sales_item()=default;^..
这个问题在这里已经有了答案:Downcastingusingthe'static_cast'inC++(3个答案)关闭8年前。我不明白为什么会这样。pReallyABase是一个向下转换的shared_pointer,它指向一个基类实例。我理解为什么编译器让我调用pReallyABase->onlyForDerived()因为我将它定义为派生类指针,但是当我尝试使用该指针调用派生类函数时为什么没有出现运行时错误?classBase{public:virtualstringwhatAmI(){return"IamaBase";}};classDerived:publicBase{publ
下面对foo的调用是否有效?GCC似乎对此很满意,而Clang为foo给出了“无匹配函数”错误;以及无法推断出N的注释。templatevoidfoo(constint(&x)[N]){}intmain(intargc,char*argv[]){foo({1,2,3});return0;} 最佳答案 编辑:随着CWGissue1591决议的通过在委员会2014年11月的session上,现在允许使用OP中的代码。编译器现在可以推断出数组中元素的类型和数量。§14.8.2.5[temp.deduct.type]/p5:Thenon-d
#include#includeintmain(){//caseI:uniforminitialization//intii=100;//Error:cannotbenarrowedfromtype'int'to'double'//ininitializerlist//doubledd{ii};//caseII:initializer_list//std::vectorvecDouble{1,2.2};//fine!//caseIII:initializer_list//std::vectorvi={1,2.3};//error:doubletointnarrowing//caseIV
有没有办法静态断言编译时已知的索引,否则在运行时断言?示例:templateclassFoo{T_data[Dim];public:constT&operator[](intidx)const{static_assert(idxfoo;foo[0];foo[1];foo[2];//compilererrorfor(inti=0;i1}return0;} 最佳答案 您可以简单地抛出异常或断言。它将在constexpr上下文中编译失败。这仅在可以在constexpr上下文中评估抛出条件时才有效。请注意,某些版本的gcc中有一个错误会阻止
我会直接去MCVE:#includestructA{inlinestaticstd::stringstreamss;};海湾合作委员会7.2和7.1refusetocompile它有以下错误:error:nomatchingfunctionforcallto'std::__cxx11::basic_stringstream::basic_stringstream()'inlinestaticstd::stringstreamss;^~Infileincludedfromblah:1:0:/opt/compiler-explorer/gcc-7.2.0/include/c++/7.2.0
Paragraph4of[expr.cast](在撰写本文时可用的最新C++标准草案中)描述了C样式转换的行为如下:Theconversionsperformedbyaconst_cast,astatic_cast,astatic_castfollowedbyaconst_cast,areinterpret_cast,orareinterpret_castfollowedbyaconst_cast,canbeperformedusingthecastnotationofexplicittypeconversion.Thesamesemanticrestrictionsan