由于关键字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
是一个非常令人困惑的名字,由于这个)
给@max66添加答案:constexpr
只能替代顶级const
。它永远不能替代指向const的指针或const引用。因此,有时constexpr
和const
可以在同一声明中使用。例如
const char* const s = "Hello";
可以替换为:
constexpr const char* s = "Hello";