![](/img/trans.png)
[英]removing constexpr from a variable capturing a constexpr function return value removes compile-time evaluation
[英]Constexpr variable is not a compile time value?
根据https://docs.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019
“constexpr 表示值或返回值是常量,如果可能,在编译时计算。”
此外, constexpr 和 static constexpr 全局变量之间的区别
“在变量声明中,constexpr 表示 const,并且命名空间 scope 中的 const 变量默认具有内部链接(因此添加 static 不会改变任何内容)。”
我认为这意味着constexpr
意味着const
意味着static
。
但是,这个问题的答案让我感到困惑: 您何时以及为什么将 static 与 constexpr 一起使用?
它指出
- “constexpr 变量不是编译时值”
- “看起来,在某些极端情况下,我们可以从 static constexpr 变量的 static 存储持续时间中受益。”
我有什么误解?
您缺少的是使用严格的 C++ 术语的地方和不使用的地方。
constexpr
变量不是编译时值,因为它不是 value 。 变量是 object 或对 object 的引用。 对象可能包含值,但对象不是值。 42 是一个值。 int i = 42;
创建一个名为i
且类型为int
的 object,并将值 42 分配给该 object。
Microsoft 文档使用白话语言,而不是严格的 C++ 术语。
一个constexpr
变量定义了一个不可变 ( const
) object ,其初始化程序应为常量表达式,因此变量本身可用于需要常量表达式的地方。
我认为这意味着
constexpr
意味着const
意味着static
。
请记住static
是 C++ 中的一个极度重载的关键字,在不同的上下文中具有非常不同的含义。 您引用的答案是响应static
的非常具体的用法:用于命名空间范围的变量。 在这种情况下, static
是不必要的,因为constexpr
命名空间范围的变量默认为内部链接。
但是您引用的另一个答案是谈论static
的其他用途,特别是功能static
。 因此,将该语句归结为“ const
意味着static
”过于简化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.