提问者:小点点

Constexpr变量不是编译时值?


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

" constexpr指示该值或返回值是常数,并且如果可能的话,是在编译时计算的."

此外,constexpr 和静态 constexpr 全局变量之间的区别

“在变量声明上,constexpr 意味着 const,命名空间范围内的 const 变量默认具有内部链接(因此添加静态不会改变任何东西)。

我认为这意味着const意味着const,这意味着静态

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

它指出

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

我误解了什么?


共1个答案

匿名用户

你缺少的是严格的C术语被使用的地方和没有使用的地方。

< code>constexpr变量不是编译时值,因为它不是一个值。变量可以是对象,也可以是对对象的引用。对象可能包含值,但对象不是值。42是一个值。< code > int i = 42创建一个名为< code>i的< code>int类型的对象,并将值42赋给该对象。

Microsoft文档使用的是本地语言,而不是严格的C术语。

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

我认为这意味着const意味着const,这意味着静态

记住< code>static在C中是一个极度重载的关键字,在不同的上下文中有非常不同的含义。您引用的答案是对< code>static的一种非常特殊的用法的回应:用于命名空间范围的变量。在这种情况下,< code>static是不必要的,因为< code>constexpr命名空间范围的变量默认为内部链接。

但是你引用的另一个答案是在谈论< code>static的其他用法,特别是function-static。因此,将这句话归结为“< code > const implies < code > static ”就过于简单化了。

相关问题