• 编译过程中就已经把值计算出来,会做类型检查;
  • define 是在预编译过程中进行简单的文本替换,不会做类型检查;
  • 在对象声明时或非静态成员函数中使用 constexpr 关键字(C++ 14)暗示这个对象或非静态成员函数是 const 的;
  • 函数或静态数据成员(C++ 17)声明中使用的 constexpr 关键字意味着内联
  • C++11 中 constexpr 函数可以使用递归,?: 三目运算符,从 C++14 开始,constexpr 函数可以在内部使用局部变量、循环和分支等简单语句;
  • constexpr 修饰的是函数参数,而不是函数返回值,函数返回值是可以被改变的
  1. constexpr 修饰变量必须满足以下要求:

    • 它的类型必须是一个LiteralType
    • 它必须立即初始化
    • 其初始化的完整表达式,包括所有隐式转换、构造函数调用等,必须是 constexpr
    • 它必须有 constexpr 析构
  2. constexpr 修饰函数必须满足以下要求:

    • 它不能是 virtual 修饰的(直到 C++20)
    • 它不能是 coroutine 协程(直到 C++20)
    • 它的返回类型(如果有的话)必须是 LiteralType
    • 所有参数必须是 LiteralType
class Test{
public:
    int x = 10;
};

int main()
{
    constexpr Test t;   // const
    cout << typeid(t.x).name() << endl; // i
    t.x = 100;  // error: assignment of member ‘Test::x’ in read-only object
    return 0;
}
static int x = 20;

constexpr int& f(int& x) {
	x = x * x;                  // 此时 x 是 400
	return x;
}

int main()
{
	f(x) = 10;
	cout << x << endl;          // 10

	return 0;
}