【发布时间】:2021-04-24 01:14:03
【问题描述】:
由于关键字constexpr 暗示const 并且它也可以在编译时计算,这是否意味着现在将变量声明为const 没有意义,我们应该始终将它们声明为constexpr?
【问题讨论】:
标签: c++ c++11 constants constexpr
由于关键字constexpr 暗示const 并且它也可以在编译时计算,这是否意味着现在将变量声明为const 没有意义,我们应该始终将它们声明为constexpr?
【问题讨论】:
标签: c++ c++11 constants constexpr
而且它也可以在编译时计算,是不是意味着现在将变量声明为
const没有意义,我们应该始终将它们声明为constexpr?
并且必须在编译时计算(忽略as-if rule)。
因此,您不能声明 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 变量的值,如果这不会改变程序的行为的话。在答案中添加了一点免责声明。
不,一点也不。
constexpr 表示“常量表达式”,如 [可能] 静态已知,如“[可能] 在编译时已知”。
const 表示“初始化后无法更改”。
这些是完全不同的概念。例如,const 对象可以使用运行时值进行初始化。
constexpr 可以暗示 const,但const 肯定不暗示constexpr。
(因此,我认为constexpr 是一个非常令人困惑的名字。)
【讨论】:
constexpr 的东西可以(通常/总是?)“不可变”,这就是const 的意思。
添加到@max66 答案:constexpr 只能替换一个顶级 const。它永远不能替换指向 const 或 const 引用的指针。所以,有时constexpr 和const 可以在同一个声明中使用。例如
const char* const s = "Hello";
可以替换为:
constexpr const char* s = "Hello";
【讨论】:
const char* const s = getValueFromSomewhere();