consexpr关键字和常量表达式

来源:互联网 发布:qq免费刷赞软件下载 编辑:程序博客网 时间:2024/05/22 12:02

常量表达式

常量表达式的定义

  • 是指值不会改变并且在编译过程中就能得到计算结果的表达式。

常量表达式的种类

  • 字面值是常量表达式

  • 用常量表达式初始化的const对象也是常量表达式

常量表达式举例

const int max_files = 20;           //max_files是常量表达式const int limit = max_files + 1;    //limit是常量表达式int staff_size = 27;                //staff_size不是常量表达式

constexpr变量

constexpr变量:

  constexpr是C++11新标准规定的规定的关键字。有时我们很难分辨一个初始值是不是常量表达式,当然可以定义一个 const变量并把它的初始值设为我们认为的某个常量表达式,但在实际使用时,尽管要求如此却常常发现初始值并非常量 表达式的情况。可以说,这时的对象的定义与使用根本就是两回事。
  
  C++11新标准规定,允许将变量声明为constexpr类型让编译器来验证变量的值是否是一个常量表达式(如果不是,编译器会报错)。
  
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf = 0; // 0 是常量表达式 constexpr int limit = mf + 1; // mf + 1 是常量表达式 constexpr int sz = size(); // 只有当 size() 是一个constexpr函数时才是一条正确的声明语句

constexpr函数

定义:

  constexpr函数是指能用于常量表达式的函数。定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:函数的返回类型以及所有形参的类型都得是字面值类型(关于字面值类型:http://blog.csdn.net/capecape/article/details/78016750),而且函数体内必须有且只有一条return语句:

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

  执行该初始化时,编译器把对constexpr函数的调用替换成其结果值。为了能在编译过程中随时展开,constexpr函数被隐式地指定为内联函数。


总结

使用constexpr的好处:

  • 是一种很强的约束,更好的保证程序的正确定语义不被破坏;

  • 编译器可以对constexper代码进行非常大的优化,例如:将用到的constexpr表达式直接替换成结果

  • 相比宏来说没有额外的开销。

总而言之,使用constexpr的目的是为了保证该变量或函数是一个常量表达式,如果不是,编译器会报错。