Constexpr变量不是编译时值
Constexpr variable is not a compile time value?
根据https://learn.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019年
"constexpr表示值或返回值是常量,如果可能的话,在编译时计算。">
此外,constexpr和静态constexpr全局变量之间的差异
"在变量声明中,constexpr表示const默认情况下,命名空间范围内的变量具有内部链接(因此添加静态不会改变任何内容(。">
我认为这意味着constexpr
暗示const
暗示static
。
然而,这个问题的答案让我感到困惑:你何时以及为什么要将static与constexpr一起使用?
它指出
- "constexpr变量不是编译时值">
- "看起来,在某些情况下,我们可以从静态constexpr变量的静态存储持续时间中受益。">
我误解了什么?
您缺少的是严格的C++术语在哪里被使用,在哪里没有。
constexpr
变量不是编译时的值,因为它不是值。变量要么是对象,要么是对对象的引用。对象可能包含值,但对象是而不是值。42是一个值。int i = 42;
创建类型为int
的名为i
的对象,并将值42分配给该对象。
微软文档使用的是本土语言,而不是严格的C++术语。
constexpr
变量定义了一个不可变(const
(对象,其初始值设定项应为常量表达式,因此变量本身可以用于需要常量表达式的地方。
我认为这意味着
constexpr
暗示const
暗示static
。
请记住,static
在C++中是一个超负荷的关键字,在不同的上下文中具有非常不同的含义。您引用的答案是对static
的一个非常具体的使用的响应:用于命名空间范围的变量。在这种情况下,static
是不必要的,因为constexpr
命名空间范围的变量默认为内部链接。
但你引用的另一个答案是关于static
的其他用法,特别是函数-static
。因此,将这句话归结为"const
意味着static
"过于简化。
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- C++ 在编译时具有函数计算全局变量
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 可视化编译与 C++ 中的 Extern 变量
- 跨模板化函数编译的静态变量
- 在编译时为运行时设置环境变量
- 全局变量在 C++ 中是否显着提高了编译速度?
- 模板类编译问题与 typedef 变量
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- C++ 编译时在两个变量之间交替
- Constexpr变量不是编译时值
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 变量 std::fstream 文件具有初始值设定项,但类型不完整 编译错误
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- 这是通过初始化 constexpr 变量来标记编译错误的合理跳转
- 使用全局变量初始化不同编译单元中的其他全局变量
- 用g++编译变量名为new的C代码时出错