C++11之constexpr

突然发现C++14都要出来了,然而我居然还没仔细的去了解C++11,飘了飘了…

在网上搜了下C++11的相关文章,感觉酷壳的这篇文章介绍的比较好.

然后发现constexpr这个C++11中新出现的关键字介绍比较少,于是就谷歌了一番,做了点总结.

constexpr的含义为常量表达式,编译器在编译期间就能求值,因此只能用常量或者常量表达式来初始化.这是一种很强的约束,能保证程序的语义不会受到破坏,并且相比于宏而言,它更安全。

constexpr函数的限制有:

  1. 函数必须有返回值.
  2. 函数必须存在定义.
  3. 函数中仅能有一个return,但允许包含typedef、 using 指令、静态断言等.
  4. 只能调用其它constexpr函数或constexpr变量.

constexpr函数可以使用递归:

constexpr int recursion(int n){
    return n > 10 ? recursion( n + 2 ) : 10;
}

构造函数的常量表达式限制有:
1. 函数体必须为空
2. 初始化列表只能由常量表达式来赋值

class Math{
public:
    constexpr Math(int x, int y, int z): _x(x),_y(y),_z(z){}
    constexpr int sum(){
        return _x+_y+_z;
    }
    constexpr int mult(){
        return _x*_y*_z;
    }
private:
    int _x, _y, _z;
}
int main(){
    constexpr Math m {2,3,4};
    constexpr int v = m.sum();
    cout<< v << endl;
}