代码改变世界

关于const和constexpr

2017-12-24 14:49  yangkehong  阅读(165)  评论(0)    收藏  举报
  • constexpr - specifies that the value of a variable or function can appear in constant expressions
 
语义上:
const并未区分出编译期常量和运行期常量
constexpr限定在了编译期常量
constexpr表示在编译期就可以算出来(前提是为了算出它所依赖的东西也是在编译期可以算出来的)。
而const只保证了运行时不直接被修改(但这个const的变量或函数仍然可能是个动态变量, 我们很多时候可以将非const对象加上const属性做为参数传给其他模块使用,即告诉使用模块不能修改它)。
 
使用建议:
constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。
但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。

constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的 evaluate at compile time.  在constexpr 出现之前, 可以在编译期初始化的const都是implicit constexpr. 直到c++ 11, constexpr才从const中细分出来成为一个关键字, 而 const从1983年 c++ 刚改名的时候就存在了... 如果你初学c++, 应当尽可能的, 合理的使用constexpr来帮助编译器优化代码.