C++关键字之constexpr

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43946347/article/details/100608743

constexpr

constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式最基础的常量表达式就是字面值或全局变量/函数的地址或sizeof等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。constexpr值可用于enum、switch、数组长度等场合。

constexpr所修饰的变量一定是编译期可求值的,所修饰的函数在其所有参数都是constexpr时,一定会返回constexpr。

constexpr int Inc(int i) {

    return i + 1;

}

constexpr int a = Inc(1);

constexpr int b = Inc(cin.get());

constexpr int c = a * 2 + 1;

constexpr函数使之能用于常量表达式的函数。函数的返回类型及所有形参的类型都是字面值类型,而且函数体中必须有且只有一条return语句。 constexpr函数其实也可以包含其他语句,只要在运行时不执行操作就可以,例如类型别名,using声明。

constexpr int new_sz() {return 42;}
constexpr int foo = new_sz();//正确,foo是一个常量表达式

为了能在编译过程中随时展开,constexpr函数隐式地指定为内联函数。
constexpr函数所有参数都是constexpr时,一定会返回constexpr。,反之则不然。
内联函数和constexpr函数一般定义在头文件中

某些类也可以是字面值类型,可能含有constexpr函数成员。数据成员都是字面值类型的聚合类是字面值常量类。其中聚合类见链接

一个字面值常量类必须至少提供一个constexpr构造函数。除非声明成=default或者=delete,否则应保证如果提供给该构造函数的参数都是constexpr,那么产生的对象中的所有成员都会是constexpr,该对象也就是constexpr对象了,可用于各种只能使用constexpr的场合。注意,constexpr构造函数必须有一个空的函数体,即所有成员变量的初始化都放到初始化列表中。

constexpr的好处
是一种很强的约束,更好地保证程序的正确语义不被破坏。
编译器可以在编译期对constexpr的代码进行非常大的优化,比如将用到的constexpr表达式都直接替换成最终结果等。
相比宏来说,没有额外的开销,但更安全可靠。

猜你喜欢

转载自blog.csdn.net/weixin_43946347/article/details/100608743