根据https://learn.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019
" constexpr指示该值或返回值是常数,并且如果可能的话,是在编译时计算的."
此外,constexpr 和静态 constexpr 全局变量之间的区别
“在变量声明上,constexpr 意味着 const,命名空间范围内的 const 变量默认具有内部链接(因此添加静态不会改变任何东西)。
我认为这意味着const
意味着const
,这意味着静态
。
然而,这个问题的答案让我很困惑:什么时候以及为什么要将static与constexpr一起使用?
它指出
我误解了什么?
你缺少的是严格的C术语被使用的地方和没有使用的地方。
< code>constexpr变量不是编译时值,因为它不是一个值。变量可以是对象,也可以是对对象的引用。对象可能包含值,但对象不是值。42是一个值。< code > int i = 42创建一个名为< code>i的< code>int类型的对象,并将值42赋给该对象。
Microsoft文档使用的是本地语言,而不是严格的C术语。
constexpr
变量定义了一个不可变 (const
) 对象,其初始值设定项应为常量表达式,因此变量本身可用于需要常量表达式的地方。
我认为这意味着const
意味着const
,这意味着静态
。
记住< code>static在C中是一个极度重载的关键字,在不同的上下文中有非常不同的含义。您引用的答案是对< code>static的一种非常特殊的用法的回应:用于命名空间范围的变量。在这种情况下,< code>static是不必要的,因为< code>constexpr命名空间范围的变量默认为内部链接。
但是你引用的另一个答案是在谈论< code>static的其他用法,特别是function-static
。因此,将这句话归结为“< code > const implies < code > static ”就过于简单化了。