- 在编译过程中就已经把值计算出来,会做类型检查;
define
是在预编译过程中进行简单的文本替换,不会做类型检查;- 在对象声明时或非静态成员函数中使用
constexpr
关键字(C++ 14)暗示这个对象或非静态成员函数是const
的; - 在函数或静态数据成员(C++ 17)声明中使用的
constexpr
关键字意味着内联; - C++11 中
constexpr
函数可以使用递归,?:
三目运算符,从 C++14 开始,constexpr 函数可以在内部使用局部变量、循环和分支等简单语句; constexpr
修饰的是函数参数,而不是函数返回值,函数返回值是可以被改变的
-
constexpr 修饰变量必须满足以下要求:
- 它的类型必须是一个LiteralType
- 它必须立即初始化
- 其初始化的完整表达式,包括所有隐式转换、构造函数调用等,必须是 constexpr
- 它必须有 constexpr 析构
-
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;
}