常量表达式
常量表达式的定义:
- 是指值不会改变并且在编译过程中就能得到计算结果的表达式。
常量表达式的种类:
字面值是常量表达式
用常量表达式初始化的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的目的是为了保证该变量或函数是一个常量表达式,如果不是,编译器会报错。