名稱空間
變體
操作

常量初始化

來自 cppreference.com
< 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 將引用繫結到右值不能是常量初始化 它可以

[編輯] 另請參閱