常量初始化
来自 cppreference.cn
将静态变量的初始值设置为编译时常量。
目录 |
[编辑] 解释
常量初始化在以下情况下执行:
|
(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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
CWG 441 | C++98 | 引用不能常量初始化 | 使其可常量初始化 |
CWG 1489 | C++11 | 尚不清楚值初始化 对象是否可以是常量初始化 |
它可以 |
CWG 1747 | C++11 | 将引用绑定到函数不能是常量初始化 | 它可以 |
CWG 1834 | C++11 | 将引用绑定到右值不能是常量初始化 | 它可以 |