constexpr NotLiteral nl2=ConstExp(nl);//无法编译constexprinta=ConstExp(1);//OK} 代码中NotLiteral不是一个定义了常量表达式构造函数的类型,因此不能够声明为常量表达式值。而模板函数ConstExp一旦以NotLiteral为参数的话,那么其constexpr关键字将被忽略。 递归 常量表达式支持至少512层的递归,可以在编译期充当...
int*constpa2[10];// pa2 is an array and contains 10 const pointer point to a non-const int constint(* p4)[10];// p4 is a non-const pointer and points to an array contains 10 const int constint(*pf)();// pf is a non-const pointer and points to a function which has no a...
structBase{constexprBase(intxx,intyy,intzz):x(xx),y(yy),z(zz){}constexprBase():Base(0,0,0){}intx;inty;intz;};constexprBasept={100,100,100};
constexpr int f(){ //error, enclosing class is not a literal type return 55; } ~NL() { } }; 对constexpr函数的调用会生成与对等效非constexpr函数的调用相同的结果,但对constexpr函数的调用可能出现在常量表达式中。 无法使用constexpr说明符声明main函数。
constexpr指针初始值必须是nullptr或0,或是存储于某个固定地址中的对象 定义在所有函数体外的对象地址固定不变 阅读C++primer 6.1.1节 constexpr声明中定义一个指针,仅对指针有效 const int *p = nullptr;//指向整型常量的指针 constexpr int * q = nullptr;//常量指针 ...
constchar* const p ="abc";p[1] ='B'; //compile errorp ="xyz"; //compile error 1. 2. 3. [5] 修饰函数参数:c语言中const修饰参数反映的含义同上所述 小结:C语言中,const的用法差不多就这些,比较简单。 C++扩充了const的用法 [1] 修饰成员变量:const成员变量只能在初始化列表里做初始化,程序...
E 为假时&(int[1]){0}的类型为int(*)[1] 另外,compound literal 要求数组维度必须在编译期可求值,也相当于要求 E 是 constexpr。 这种方法就介绍到这里了,从 C23 开始 constexpr 也成了 C 语言的关键字,会有更多精彩的方法等待着大家去发掘~
Constexpr用于定义可在编译时计算的常量表达式。 1. 编译器时间常数函数,编译器可以计算函数的值。例如,可以用constexpr函数更好地替换某些宏函数。 2. 编译时常量数据,如一些在类和类模板中定义的静态常量数据,过去是用static const来定义的,现在可以用constexpr来定义,这样可以达到更好的效率和安全性。
constexpr函数在调用时若传入的实参值是由编译期已知的,则会产出编译期结果; 比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。