Constexpr变量不是编译时值

Constexpr variable is not a compile time value?

本文关键字:编译 变量 Constexpr      更新时间:2023-10-16

根据https://learn.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019年

"constexpr表示值或返回值是常量,如果可能的话,在编译时计算。">

此外,constexpr和静态constexpr全局变量之间的差异

"在变量声明中,constexpr表示const默认情况下,命名空间范围内的变量具有内部链接(因此添加静态不会改变任何内容(。">

我认为这意味着constexpr暗示const暗示static

然而,这个问题的答案让我感到困惑:你何时以及为什么要将static与constexpr一起使用?

它指出

  1. "constexpr变量不是编译时值">
  2. "看起来,在某些情况下,我们可以从静态constexpr变量的静态存储持续时间中受益。">

我误解了什么?

您缺少的是严格的C++术语在哪里被使用,在哪里没有。

constexpr变量不是编译时的值,因为它不是值。变量要么是对象,要么是对对象的引用。对象可能包含值,但对象是而不是值。42是一个值。int i = 42;创建类型为int的名为i的对象,并将值42分配给该对象。

微软文档使用的是本土语言,而不是严格的C++术语。

constexpr变量定义了一个不可变(const(对象,其初始值设定项应为常量表达式,因此变量本身可以用于需要常量表达式的地方。


我认为这意味着constexpr暗示const暗示static

请记住,static在C++中是一个超负荷的关键字,在不同的上下文中具有非常不同的含义。您引用的答案是对static的一个非常具体的使用的响应:用于命名空间范围的变量。在这种情况下,static是不必要的,因为constexpr命名空间范围的变量默认为内部链接。

但你引用的另一个答案是关于static其他用法,特别是函数-static。因此,将这句话归结为"const意味着static"过于简化。