比如:
cons int a = 8;
consexpr int a = 8;
这两个有什么区别?
const
和 constexpr
都是用于定义常量的关键字,但它们有一些不同之处:
const
常量是在运行时计算的,而 constexpr
常量是在编译时计算的。这意味着 constexpr
常量可以被用于要求常量表达式的上下文中,比如数组大小、模板参数等。而 const
常量则不能。constexpr
常量只能被赋值为编译时常量表达式,而 const
常量可以被赋值为任何表达式,包括运行时表达式。在代码中,const int a
和 constexpr int a
都定义了一个名为 a
的常量,并赋值为 8
。它们的区别在于,const int
常量是在运行时计算的,而 constexpr int
常量是在编译时计算的。
因此,如果您需要在编译时计算一个常量,建议使用 constexpr
来定义常量。如果您需要在运行时计算一个常量,或者需要在常量表达式之外对其进行赋值,可以使用 const
来定义常量。
举例来说:
#include <iostream>
constexpr int x = 5 + 3; // 编译时常量表达式
const int y = x * 2; // 运行时表达式
int main()
{
constexpr int z = x * y; // 编译错误,y 不是编译时常量表达式
std::cout << "x = " << x << std::endl;
std::cout << "y = " << y << std::endl;
return 0;
}
在上面的代码中,x
是一个 constexpr
常量,其值是 5 + 3
,这是一个编译时常量表达式。而 y
是一个 const
常量,其值是 x * 2
,这是一个运行时表达式。在 main()
函数中,我们试图用 x
和 y
计算一个新的常量 z
,但是由于 y
不是编译时常量表达式,所以编译器会报错。
因此,可以看出 constexpr
常量只能被赋值为编译时常量表达式,而 const
常量可以被赋值为任何表达式,包括运行时表达式。