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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Constexpr变量不是编译时间值吗?相关的知识,希望对你有一定的参考价值。

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

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

另外,Difference between constexpr and static constexpr global variable

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

我认为这意味着constexpr表示const,这表示static

但是,这个问题的答案使我感到困惑:When and why would you use static with constexpr?

它指出

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

我有什么误会?

答案

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

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

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

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


我认为这意味着constexpr表示const,这表示static

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

但是您引用的另一个答案是关于staticother使用,特别是函数-static。因此,将该语句归结为“ const意味着static”太简明了。

以上是关于Constexpr变量不是编译时间值吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 constexpr 添加到语言后是不是将变量声明为 const 多余?

未捕获 constexpr 变量

使用 constexpr 成员函数初始化 constexpr 成员变量

方法参数可以包含对其他变量的引用而不是包含值吗?

constexpr

带有 constexpr 声明变量的奇怪错误 C2131