草庐IT

constexpr-ness

全部标签

c++ - constexpr 上的模板元编程示例?

是否有任何示例表明模板元编程比新的constexpr更好用?据我了解,constexpr和模板元编程都有相似的目的,但模板元编程并没有过时。所以必须有一些例子,其中模板元编程比constexpr更受欢迎。任何对此的共同想法将不胜感激,谢谢! 最佳答案 constexpr以真正的C++函数形式提供对编译时计算的真正支持,而不是类似函数式的基于模板的构造(元函数)。因此,部分答案是是constexpr在编译时计算方面胜过tmp,至少在它的语法上对于没有使用fp的习惯C++的人来说是这样。请注意,我忽略了对编译器性能等的担忧。另一方面,t

c++ - 是否可以声明一个 constexpr 指针而不是指向 constexpr 的指针?

这样说对吗constexprint*p=nullptr;声明constexpr指针(而不是指向constexprint的指针)?这个定义int*constexprp=nullptr;给出一个编译错误。 最佳答案 标准在[dcl.constexpr]/1中说只有变量或函数(及其模板)可以是constexpr:Theconstexprspecifiershallbeappliedonlytothedefinitionofavariableorvariabletemplateorthedeclarationofafunctionorfun

c++ - 十六进制字符到 std::string 的 constexpr 转换

我有很多这样的字符串:"343536"_hex我想将其转换成相应的字节串。我正在使用C++11并定义了一个用户定义的字符串文字以将它们转换为十六进制字符串。但是,我目前拥有的转换不能作为我正在寻找的constexpr进行评估。特别是我想使用这样的东西,但作为constexpr:std::stringoperator""_hex(constchar*s,std::size_tslen){std::stringstr;str.reserve(slen);charch[3];unsignedlongnum;ch[2]='\0';for(;slen;slen-=2,s+=2){ch[0]=s[

c++ - `if constexpr`可以用来声明不同类型和init-expr的变量吗

例如:voidfoo(){ifconstexpr(...)intx=5;elsedoublex=10.0;bar(x);//callsdifferentoverloadsofbarwithdifferentvalues}这在D语言中很常见,但我没有找到有关C++17的信息。当然也可以用类似的东西std::conditional::typex;但仅限于基本情况。即使是不同的初始化程序(如上)也会造成大问题。 最佳答案 此代码无法运行。问题是当您调用bar时x超出范围。但有一个解决方法:constexprautot=[]()->auto

C++14:你能在 constexpr 中调用 new 吗?

当C++14取消对constexpr的限制时,它似乎包括以下内容(从Wikipedia复制):Expressionsmaychangethevalueofanobjectifthelifetimeofthatobjectbeganwithintheconstantexpressionfunction.Thisincludescallstoanynon-constconstexpr-declarednon-staticmemberfunctions.这似乎意味着您可以使用new创建一个对象,只要您在表达式中delete它,它就被允许。 最佳答案

c++ - 难以理解 C++14 宽松的 constexpr 限制

我遇到了std::max函数的新C++14签名:templateconstT&max(constT&a,constT&b);//(C++11)templateconstexprconstT&max(constT&a,constT&b);//(C++14)我读过关于C++14的放宽constexpr限制提案,但我仍然不明白为什么这个函数返回值可以是constexpr例子:std::vectora,b;//Thisdoesnotcompilebutasmyunderstadndingof`constexpr`thisshouldintarray[std::max(a.size(),b.si

c++ - 可能的模板和 constexpr——如果不兼容

我想在编译时计算e值(别担心,不是家庭作业),但出了点问题。template,size_tfactorial=1,size_tcount=1>constexprdoublee_impl(){ifconstexpr(limit==0){returnstatic_cast(result{}.num)/result{}.den;}returne_impl>,factorial*count,count+1>();}虽然计算值是正确的,但编译器会抛出有关模板溢出的错误。似乎limit变量超出了范围(低于0),但它不应该发生,因为0–情况正在被处理ifconstexpr(...)语句。所以问题是,

c++ - constexpr 函数是隐式静态的吗?

如果我在我的program.cpp中定义一个函数:constexprboolisThree(constintnumber){returnnumber==3;}这与声明它为静态有什么不同吗?staticconstexprboolisThree(constintnumber){returnnumber==3;}看起来这些应该是等价的,因为constexpr意味着函数是内联的,因此不在编译单元之间共享。constexpr全局函数是隐式静态的吗? 最佳答案 constexpr函数是隐式内联。inline是一种链接功能。在不同编译单元中定义的

c++ - clang 3.3 和 GCC 4.7 const v 的 constexpr

我刚刚尝试在Ubuntu13.04上使用带有GCC4.7.3标准库头文件的clang3.3编译大量代码。这一切都很顺利,除了一个问题。这段代码已经在这台机器上用标准的Ubuntuclang3.2包编译,所以我假设这是clang3.3编译器的一些变化。与使用复杂header的const和constexpr有关的问题。特别是复杂类型具有以下代码块#ifdef__GXX_EXPERIMENTAL_CXX0X__//_GLIBCXX_RESOLVE_LIB_DEFECTS//DR387.std::complexover-encapsulated.constexprdoublereal(){re

类型的 C++ constexpr 值

我希望能够通过类型的ID创建switch语句。我发现了一种可以为不同类型提供唯一ID的机制。非常简单:templatestructtype{staticvoidid(){}};templateconstexprconstsize_ttype_id(){returnreinterpret_cast(&type::id);}我认为这会评估为一个常量,我可以将其用作开关的案例。但是当我执行以下操作时出现错误,即case表达式不是常量:intmain(void){size_ta=type_id();switch(a){casetype_id():break;}return0;}为什么不是常量?