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?
它指出
- “ constexpr变量不是编译时值”
- “看来,在某些特殊情况下,我们可以受益于静态constexpr变量的静态存储持续时间。”
我有什么误会?
您所缺少的是在哪里使用了严格的C ++术语,而没有在哪里使用。
A constexpr
变量不是编译时值,因为它是非值。变量是对象或对对象的引用。对象可以包含值,但是对象是not值。 42是一个值。 int i = 42;
创建一个类型为i
的名为int
的对象,并将值42分配给该对象。
Microsoft文档使用的是本地语言,而不是严格的C ++术语。
constexpr
变量定义了一个不变的[const
)对象,其初始化程序应为常量表达式,因此,变量本身可以在需要常量表达式的地方使用。
我认为这意味着
constexpr
表示const
,这表示static
。
[请记住,static
是C ++中一个非常重载的关键字,在不同的上下文中它的含义非常不同。您引用的答案是对static
的非常特定的使用的响应:对于命名空间范围的变量。在那种情况下,static
是不必要的,因为constexpr
名称空间范围的变量默认为内部链接。
但是您引用的另一个答案是关于static
的other使用,特别是函数-static
。因此,将该语句归结为“ const
意味着static
”太简明了。
以上是关于Constexpr变量不是编译时间值吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 constexpr 添加到语言后是不是将变量声明为 const 多余?