在将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. 它永远不能替代指向常量的指针或常量引用。所以,有时constexprconst可以用在同一个声明中。例如

const char* const s = "Hello";

可以替换为:

constexpr const char* s = "Hello";


以上是在将constexpr添加到语言后,将变量声明为const是多余的吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>