Constant initialization
From cppreference.net
将 静态 变量的初始值设置为编译期常量。
目录 |
说明
常量初始化 在以下情况下执行:
|
(C++11 前) |
|
(C++11 起)
(C++17 前) |
|
(C++17 起)
(C++20 前) |
|
| (C++20 起) |
常量初始化的效果与对应初始化的效果相同,但保证其在任何其他静态 或线程局部 (since C++11) 对象的初始化开始之前完成。
注释
编译器被允许使用常量初始化来初始化其他静态 和线程局部 (since C++11) 对象,前提是能够保证该值与遵循标准初始化顺序时得到的值完全相同。
常量初始化通常发生在程序加载到内存时,作为程序运行时环境初始化的一部分。
示例
运行此代码
#include <iostream> #include <array> struct S { static const int c; }; const int d = 10 * S::c; // 不是常量表达式:S::c 没有前置初始化器 // 该初始化发生在 const 初始化之后 const int S::c = 5; // 常量初始化,保证首先执行 int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // 正确:S::c 是常量表达式 // std::array<int, d> a2; // 错误:d 不是常量表达式 }
输出:
d = 50
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| CWG 441 | C++98 | 引用无法进行常量初始化 | 使其可常量初始化 |
| CWG 1489 | C++11 |
值初始化对象是否属于常量初始化
的规定不明确 |
允许作为常量初始化 |
| CWG 1747 | C++11 | 绑定引用到函数不能作为常量初始化 | 允许作为常量初始化 |
| CWG 1834 | C++11 | 绑定引用到xvalue不能作为常量初始化 | 允许作为常量初始化 |