Constant initialization
From cppreference.net
static 변수의 초기값을 컴파일 타임 상수로 설정합니다.
목차 |
설명
상수 초기화 는 다음과 같은 경우에 수행됩니다:
|
(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; // 상수 표현식이 아님: S::c에 선행 초기화자가 없으며 // 이 초기화는 const 초기화 이후에 발생함 const int S::c = 5; // 상수 초기화, 반드시 먼저 발생함이 보장됨 int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK: S::c는 상수 표현식임 // std::array<int, d> a2; // 오류: d는 상수 표현식이 아님 }
출력:
d = 50
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 441 | C++98 | 참조형은 상수 초기화가 불가능했음 | 상수 초기화 가능하도록 변경됨 |
| CWG 1489 | C++11 | 값 초기화가 상수 초기화인지 명확하지 않았음 | 상수 초기화 가능함 |
| CWG 1747 | C++11 | 함수에 대한 참조 바인딩이 상수 초기화 불가능했음 | 상수 초기화 가능함 |
| CWG 1834 | C++11 | xvalue에 대한 참조 바인딩이 상수 초기화 불가능했음 | 상수 초기화 가능함 |