在constexpr被添加到语言后,是否将变量声明为const冗余?



由于关键字constexpr意味着const,并且它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constexpr?

并且它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constexpr?

必须在编译时计算(忽略as-if规则)。

所以你不能声明constexpr是一个用运行时已知值初始化的变量。但是你可以声明它为const

例如:你不能声明barconstexpr

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是一个非常令人困惑的名字,由于这个)

给@max66添加答案:constexpr只能替代顶级const。它永远不能替代指向const的指针或const引用。因此,有时constexprconst可以在同一声明中使用。例如

const char* const s = "Hello";

可以替换为:

constexpr const char* s = "Hello";

最新更新