常量初始化
來自 cppreference.com
將靜態變數的初始值設定為編譯時常量。
目錄 |
[編輯] 解釋
常量初始化在以下情況下執行:
|
(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 | 將引用繫結到右值不能是常量初始化 | 它可以 |