首页 > 解决方案 > constexpr 变量不是编译时值吗?

问题描述

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

“constexpr 表示值或返回值是常量,如果可能,在编译时计算。”

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

“在变量声明中,constexpr 意味着 const,并且命名空间范围内的 const 变量默认具有内部链接(因此添加静态不会改变任何内容)。”

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

然而,这个问题的答案让我感到困惑:何时以及为什么将静态与 constexpr 一起使用?

它指出

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

我有什么误解?

标签: c++constexpr

解决方案


您缺少的是使用严格的 C++ 术语的地方和不使用的地方。

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

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

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


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

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

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


推荐阅读