常量初始化
来自 cppreference.cn
将 static 变量的初始值设置为编译时常量。
目录 |
[编辑] 解释
常量初始化 在以下情况下执行
|
(C++11 前) |
|
(自 C++11 起) (C++17 前) |
(自 C++17 起) (C++20 前) | |
(自 C++20 起) |
常量初始化的效果与相应初始化的效果相同,但保证它在任何其他静态 或线程局部(自 C++11 起)对象开始初始化之前完成。
[编辑] 注解
如果编译器可以保证该值与遵循标准初始化顺序时的值相同,则允许编译器使用常量初始化来初始化其他静态 和线程局部(自 C++11 起)对象。
常量初始化通常在程序加载到内存时发生,作为初始化程序运行时环境的一部分。
[编辑] 示例
运行此代码
#include <iostream> #include <array> struct S { static const int c; }; const int d = 10 * S::c; // not a constant expression: S::c has no preceding // initializer, this initialization happens after const const int S::c = 5; // constant initialization, guaranteed to happen first int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK: S::c is a constant expression // std::array<int, d> a2; // error: d is not a constant expression }
输出
d = 50
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
CWG 441 | C++98 | 引用不能被常量初始化 | 使其可常量初始化 |
CWG 1489 | C++11 | 不清楚值初始化是否 对象可以是常量初始化 |
它可以 |
CWG 1747 | C++11 | 将引用绑定到函数不能是常量初始化 | 它可以 |
CWG 1834 | C++11 | 将引用绑定到 xvalue 不能是常量初始化 | 它可以 |