c++ - constexpr 变量不是编译时值吗?
问题描述
根据https://docs.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019
“constexpr 表示值或返回值是常量,如果可能,在编译时计算。”
此外,constexpr 和静态 constexpr 全局变量之间的区别
“在变量声明中,constexpr 意味着 const,并且命名空间范围内的 const 变量默认具有内部链接(因此添加静态不会改变任何内容)。”
我认为这constexpr
意味着意味着const
意味着static
。
然而,这个问题的答案让我感到困惑:何时以及为什么将静态与 constexpr 一起使用?
它指出
- “constexpr 变量不是编译时值”
- “看起来,在某些极端情况下,我们可以从静态 constexpr 变量的静态存储持续时间中受益。”
我有什么误解?
解决方案
您缺少的是使用严格的 C++ 术语的地方和不使用的地方。
constexpr
变量不是编译时值,因为它不是值。变量要么是对象,要么是对对象的引用。对象可能包含值,但对象不是值。42 是一个值。int i = 42;
创建一个名为i
type的对象int
,并将值 42 分配给该对象。
Microsoft 文档使用白话语言,而不是严格的 C++ 术语。
constexpr
变量定义了一个不可变 ( )const
对象,其初始值设定项应为常量表达式,因此变量本身可用于需要常量表达式的地方。
我认为这
constexpr
意味着意味着const
意味着static
。
请记住,这static
是 C++ 中一个极其重载的关键字,它在不同的上下文中具有非常不同的含义。static
您引用的答案是对: 命名空间范围变量的非常具体的使用作出响应。在这种情况下,这static
是不必要的,因为constexpr
命名空间范围的变量默认为内部链接。
但是您引用的另一个答案是谈论 的其他用途static
,特别是功能- static
。因此,将该陈述归结为“const
暗示static
”过于简化。
推荐阅读
- visual-studio - 当我键入它们时,Visual Studio 会删除我的胡萝卜前面的单词
- javascript - 删除一个组件中的项目会导致应用程序中断并引发未定义的错误
- ocaml - utop 和打印构造函数
- python - Python Selenium尝试:返回字符串除了:返回布尔值
- python - 使用分类算法进行文本分类时如何提高模型准确性
- microsoft-graph-api - 通过 Microsoft Graph 获取我自己的通话列表
- python - Cloudify python脚本插件-如何使用包?
- mysql - 如何计算博客的总评论和反应
- javascript - 如果不是 null Javascript,则传递可选参数的正确方法
- c# - 在当前步骤的处理完成之前,Specflow 应用程序移动到下一步