草庐IT

constexpr-ness

全部标签

c++ - 使用 constexpr 函数替代 reinterpret_cast

下面,你会发现一个用于CRC32计算的constexpr字符串文字。我不得不重新解释char中的字符串文字字符。至unsignedchar.因为reinterpret_cast在constexpr函数中不可用,解决方法是手动补码的一个小实用函数,但我对它有点失望。是否存在更优雅的解决方案来处理这种操作?#includeclassCrc32Gen{uint32_tm_[256]{};staticconstexprunsignedcharreinterpret_cast_schar_to_uchar(charv){returnv>=0?v:~(v-1);}public://algorith

c++ - constexpr 标准仿函数的正确用法是什么?

取以下代码:#include#includetemplateclassOp>autoapplyOp(constuint8_tlhs,constuint8_trhs){constexprOpop;returnop(lhs,rhs);}intmain(){std::cout(19,180)当使用g++时,它编译并运行得很好。但是clang++会产生错误:test.cpp:5:27:error:defaultinitializationofanobjectofconsttype'constbit_and'(aka'constbit_and')withoutauser-provideddefa

c++ - constexpr 标准仿函数的正确用法是什么?

取以下代码:#include#includetemplateclassOp>autoapplyOp(constuint8_tlhs,constuint8_trhs){constexprOpop;returnop(lhs,rhs);}intmain(){std::cout(19,180)当使用g++时,它编译并运行得很好。但是clang++会产生错误:test.cpp:5:27:error:defaultinitializationofanobjectofconsttype'constbit_and'(aka'constbit_and')withoutauser-provideddefa

c++ - emplace_back 导致静态 constexpr 成员上的链接错误

为什么emplace_back引用需要定义的成员?emplace_back(integerliteral)和emplace_back(staticconstexprintegermember)有什么区别?如果我切换到C++17,它编译得很好。我发现在C++17中静态constexpr数据成员是隐式的inlined.这是否意味着编译器隐式地为它们创建了一个定义?示例代码:classbase{intn;public:base(intn):n(n){}};structbase_trait{staticconstexprintn=1;};intmain(void){vectorv;v.empl

c++ - emplace_back 导致静态 constexpr 成员上的链接错误

为什么emplace_back引用需要定义的成员?emplace_back(integerliteral)和emplace_back(staticconstexprintegermember)有什么区别?如果我切换到C++17,它编译得很好。我发现在C++17中静态constexpr数据成员是隐式的inlined.这是否意味着编译器隐式地为它们创建了一个定义?示例代码:classbase{intn;public:base(intn):n(n){}};structbase_trait{staticconstexprintn=1;};intmain(void){vectorv;v.empl

c++ - 对 constexpr 函数有点困惑

考虑以下代码:constexprconstint*address(constint&r){return&r;}intmain(){intx=10;constexprconstint*p=address(x);//error_getch();return0;}这是一个错误:“函数调用必须在常量表达式中具有常量值”。好的。两个问题:如果“x”声明为静态,则没有错误。为什么?如何在编译过程中获取变量地址?它们不是在运行时分配的吗? 最佳答案 If'x'isdeclaredstatic,therearenoerrors.Why?这是因为程序

c++ - 对 constexpr 函数有点困惑

考虑以下代码:constexprconstint*address(constint&r){return&r;}intmain(){intx=10;constexprconstint*p=address(x);//error_getch();return0;}这是一个错误:“函数调用必须在常量表达式中具有常量值”。好的。两个问题:如果“x”声明为静态,则没有错误。为什么?如何在编译过程中获取变量地址?它们不是在运行时分配的吗? 最佳答案 If'x'isdeclaredstatic,therearenoerrors.Why?这是因为程序

c++ - 使用 constexpr 查找表

我希望创建一个坐标查找表,例如:inta[n][2]={{0,1},{2,3},...}对于给定的n,在编译时创建。我开始研究constexpr,但似乎是一个返回constexprstd::vector>的函数据我所知,这不是一个选择:invalidreturntype'std::vector>'ofconstexprfunction怎样才能创建这样一个编译时数组? 最佳答案 使用C++14,您不需要太多的模板魔法。这里是一个如何为f(x)=x^3查找表的示例,其中第一个坐标是x值,第二个坐标是f(x)值:#includetempl

c++ - 使用 constexpr 查找表

我希望创建一个坐标查找表,例如:inta[n][2]={{0,1},{2,3},...}对于给定的n,在编译时创建。我开始研究constexpr,但似乎是一个返回constexprstd::vector>的函数据我所知,这不是一个选择:invalidreturntype'std::vector>'ofconstexprfunction怎样才能创建这样一个编译时数组? 最佳答案 使用C++14,您不需要太多的模板魔法。这里是一个如何为f(x)=x^3查找表的示例,其中第一个坐标是x值,第二个坐标是f(x)值:#includetempl

c++ - 未找到使用表达式模板化的静态 constexpr 成员函数

如下代码#includetemplatestructkernel{staticconstexprunsignedmax_pole(unsignedP){returnP>MaxP?MaxP:P;}templateusingarray=std::array;//wrong?templatestaticvoiddo_something(arrayconst&,array&);};gcc4.7.0(g++-c-std=c++11)给出error:‘max_pole’wasnotdeclaredinthisscope这是正确的(编译器的行为)吗?请注意,如果我通过在指示的行上用kernel::m