constant initialization
常数初始化
设置静态常量的初始值。
句法
static T & ref = constexpr; | (1) | |
---|---|---|
static T object = constexpr; | (2) | |
解释
常数初始化在%28之后执行,直到C++14%29,而不是%28,因为C++14%29静态和线程本地对象的零初始化以及所有其他初始化之前。只有以下变量是常量初始化的:
1%29静态或线程本地引用,如果它绑定到静态极值、临时对象%28或其子对象%29或函数。如果每个表达式%28包括隐式转换初始化器的引用是常数表达式...
2%29类类型的静态或线程本地对象,如果构造函数为司法官所有构造函数参数%28(包括隐式转换)都是常数表达式,如果构造函数%27s初始化程序列表中的初始化器和类成员的大括号或相等初始化项仅包含常量表达式。
3%29静态或线程本地对象%28不一定为类类型%29,如果对象是值初始化或者,如果它的初始化器中的每个表达式都是一个常量表达式。
常量初始化的效果与相应初始化的效果相同,只是%27s保证在静态或线程本地对象的任何其他初始化开始之前完成初始化,并且可以在编译时执行。
注记
如果编译器能够保证值与初始化的标准顺序相同,则允许编译器使用常量初始化初始化其他静态和线程本地对象。
例
二次
#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 | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2026 | C++14 | zero-init was specified to always occur first, even before constant-init | no zero-init if constant init applies |
另见
- 常数说明符
- 零初始化
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。