我试图在编译时计算字符串文字的长度。为此,我使用以下代码:#includeintconstexprlength(constchar*str){return*str?1+length(str+1):0;}intmain(){printf("%d%d",length("abcd"),length("abcdefgh"));}一切正常,程序打印出4和8。clang生成的汇编代码显示结果是在编译时计算的:0x100000f5e:leaq0x35(%rip),%rdi;"%d%d"0x100000f65:movl$0x4,%esi0x100000f6a:movl$0x8,%edx0x100000
如果我在函数中有一个变量(例如,一个大数组),那么同时声明static和constexpr是否有意义?constexpr保证数组是在编译时创建的,那么static会不会没用?voidf(){staticconstexprintx[]={//afewthousandelements};//dosomethingwiththearray}static是否真的在生成代码或语义方面做了任何事情? 最佳答案 简短的回答是,static不仅有用,而且总是很受欢迎。首先,请注意static和constexpr是完全相互独立的。static定义对象
我想在我的类(class)中有一个staticconstchar数组。GCC提示并告诉我应该使用constexpr,尽管现在它告诉我这是一个undefinedreference。如果我使数组成为非成员,那么它会编译。怎么回事?//.hppstructfoo{voidbar();staticconstexprcharbaz[]="quz";};//.cppvoidfoo::bar(){std::stringstr(baz);//undefinedreferencetobaz} 最佳答案 添加到您的cpp文件中:constexprcha
有一个众所周知的技巧可以通过执行以下操作在constexpr函数的评估中导致编译时错误:constexprintf(intx){return(x!=0)?x:throwstd::logic_error("Ohno!");}如果在constexpr上下文中使用该函数,如果x==0则会出现编译时错误。但是,如果f的参数不是constexpr,那么如果x==0,它将在运行时抛出异常,这可能不会出于性能原因总是需要的。类似于assert被NDEBUG保护的理论,有没有办法用constexpr函数导致编译时错误,但在运行时不执行任何操作?最后,C++1y(C++14)中宽松的constexpr规
有一个众所周知的技巧可以通过执行以下操作在constexpr函数的评估中导致编译时错误:constexprintf(intx){return(x!=0)?x:throwstd::logic_error("Ohno!");}如果在constexpr上下文中使用该函数,如果x==0则会出现编译时错误。但是,如果f的参数不是constexpr,那么如果x==0,它将在运行时抛出异常,这可能不会出于性能原因总是需要的。类似于assert被NDEBUG保护的理论,有没有办法用constexpr函数导致编译时错误,但在运行时不执行任何操作?最后,C++1y(C++14)中宽松的constexpr规
这是有效的代码:structS{constexprS(intx,inty):xVal(x),yVal(y){}constexprS(intx):xVal(x){}constexprS(){}constintxVal{0};constintyVal{0};};但在这里我真的很想声明xVal和yValconstexpr——像这样:structS{constexprS(intx,inty):xVal(x),yVal(y){}constexprS(intx):xVal(x){}constexprS(){}constexprintxVal{0};//error!constexprintyVal{
这是有效的代码:structS{constexprS(intx,inty):xVal(x),yVal(y){}constexprS(intx):xVal(x){}constexprS(){}constintxVal{0};constintyVal{0};};但在这里我真的很想声明xVal和yValconstexpr——像这样:structS{constexprS(intx,inty):xVal(x),yVal(y){}constexprS(intx):xVal(x){}constexprS(){}constexprintxVal{0};//error!constexprintyVal{
根据GeneralizedConstantExpressions—Revision5以下是非法的:constexprintg(intn)//error:bodynotjust‘‘returnexpr’’{intr=n;while(--n>1)r*=n;returnr;}这是因为所有'constexpr'函数都必须采用{returnexpression;形式。}。我看不出有任何理由需要这样做。在我看来,唯一真正需要的是不读取/写入外部状态信息,并且传入的参数也是“constexpr”语句。这意味着对具有相同参数的函数的任何调用都将返回相同的结果,因此可以在编译时“知道”。我对此的主要问题
根据GeneralizedConstantExpressions—Revision5以下是非法的:constexprintg(intn)//error:bodynotjust‘‘returnexpr’’{intr=n;while(--n>1)r*=n;returnr;}这是因为所有'constexpr'函数都必须采用{returnexpression;形式。}。我看不出有任何理由需要这样做。在我看来,唯一真正需要的是不读取/写入外部状态信息,并且传入的参数也是“constexpr”语句。这意味着对具有相同参数的函数的任何调用都将返回相同的结果,因此可以在编译时“知道”。我对此的主要问题
也许我错过了什么,但我找不到任何提示:C++17中是否有一个与constexpr-if等效的constexpr三元运算符?templateclassBusAddress{public:explicitconstexprBusAddress(Addressdevice):mAddress(Mode::write?(device.mDevice 最佳答案 不,没有constexepr条件运算符。但是您可以将整个内容包装在lambda中并立即对其进行评估(IIFE):templateclassBusAddress{public:expli