在将constexpr添加到语言后,将变量声明为const是多余的吗?
正如关键字constexpr所暗示的const,它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constexpr?
回答
并且它也可以在编译时计算,这是否意味着现在将变量声明为
const没有意义,我们应该始终将它们声明为constexpr?
并且必须在编译时计算(忽略as-if 规则)。
所以你不能声明constexpr一个用运行时已知值初始化的变量。但是你可以声明它const。
例如:你不能声明 bar constexpr
int foo;
std::cin >> foo;
constexpr int bar = foo; // compilation error
但你可以申报 const
int foo;
std::cin >> foo;
const int bar = foo; // compile
回答
一点都不。
constexpr 表示“常量表达式”,如 [可能] 静态已知,如“[可能] 在编译时已知”。
const 表示“初始化后无法更改”。
这些是完全独立的概念。例如,const可以使用运行时值初始化对象。
constexpr可以暗示 const,但const肯定不暗示constexpr。
(因此,我认为这constexpr是一个非常令人困惑的名字。)
- *"but const certainly does not imply constexpr"* - except for the annoying little legacy tidbit involving integral types and enumerations. Where it may be a bit of a Schrödinger's constexpr.
回答
添加到@max66 答案:constexpr只能替换顶级 const. 它永远不能替代指向常量的指针或常量引用。所以,有时constexpr和const可以用在同一个声明中。例如
const char* const s = "Hello";
可以替换为:
constexpr const char* s = "Hello";