Constexpr变量不是编译时间值吗?

csg*_*guy 3 c++ constexpr

根据https://docs.microsoft.com/zh-cn/cpp/cpp/constexpr-cpp?view=vs-2019

“ constexpr表示该值或返回值是恒定的,并且,如果可能,在编译时进行计算。”

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

“在变量声明中,constexpr隐含const,并且默认情况下,名称空间范围内的const变量具有内部链接(因此,添加static不会更改任何内容)。”

我认为这constexpr意味着const隐含static

但是,这个问题的答案使我感到困惑:什么时候以及为什么在constexpr中使用static?

它指出

  1. “ constexpr变量不是编译时值”
  2. “看来,在某些特殊情况下,我们可以受益于静态constexpr变量的静态存储持续时间。”

我有什么误会?

Nic*_*las 9

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

一个constexpr变量是不是编译时间价值,因为它是不是一个值。变量是对象或对对象的引用。对象可以包含值,但对象不是值。42是一个值。int i = 42;创建一个名为itype 的对象int,并将值42分配给该对象。

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

constexpr变量定义一个不可变(const)对象,其初始化应是常量表达式,因此变量本身可以在需要的常量表达式地方使用。


我认为这constexpr意味着const隐含static

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

但是,您引用的另一个答案是谈论功能的其他用途static,特别是function- static。因此,将该陈述简化为“ const暗含static”是太过简化了。