【问题标题】:Constexpr variable is not a compile time value?constexpr 变量不是编译时值吗?
【发布时间】:2020-03-06 18:49:15
【问题描述】:

根据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 默认情况下,命名空间范围内的变量具有内部链接(因此添加 static 不会改变任何东西)。”

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

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

它表明

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

我误会了什么?

【问题讨论】:

  • "constexpr 暗示 const 暗示 static"。不,constexpr 确实暗示了const(但不一定是相反的)。 const 并不暗示 static
  • @Peter const 确实暗示了static(即内部链接)。但仅在命名空间范围内。例外情况适用。

标签: c++ constexpr


【解决方案1】:

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

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

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

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


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

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

但您引用的另一个答案是关于static其他 用途,特别是函数-static。所以把这句话归结为“const 暗示static”太简化了。

【讨论】:

  • 当您说命名空间范围时,您指的是全局范围吗?
  • 我很确定你不是,但我认为stackoverflow.com/questions/45987571/… 提供的示例都在全球范围内?
  • ohhhh 我明白了,全局作用域是一种命名空间作用域
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2016-09-27
  • 2021-05-05
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多