命名空间
变体
操作

常量初始化

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

静态变量的初始值设置为编译时常量。

目录

[编辑] 解释

常量初始化在以下情况下执行:

  • 使用常量表达式初始化具有静态存储期的POD类型对象。
(C++11 前)
  • 初始化具有静态线程存储期的引用,其中满足所有以下条件:
  • 指定具有静态存储期对象的左值
  • 临时对象
  • 临时对象的子对象
  • 函数
  • 初始化具有静态或线程存储期的对象,并满足以下条件之一:
  • 如果对象通过构造函数调用初始化,其中初始化完整表达式是一个常量表达式,但它也可以为对象及其子对象调用constexpr 构造函数(即使这些对象是非字面类类型)。
  • 否则,对象是值初始化的,或者其初始化器中出现的每个完整表达式都是常量表达式。
(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 将引用绑定到右值不能是常量初始化 它可以

[编辑] 另请参阅