Namespaces
Variants

Constant initialization

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

static 변수의 초기값을 컴파일 타임 상수로 설정합니다.

목차

설명

상수 초기화 는 다음과 같은 경우에 수행됩니다:

  • POD 타입 의 객체를 정적 저장 기간으로 상수 표현식으로 초기화하는 경우.
(C++11까지)
  • 다음 모든 조건을 만족하는 정적 또는 스레드 저장 기간을 가진 참조를 초기화하는 경우:
  • 정적 저장 기간을 가진 객체를 지정하는 lvalue
  • 임시 객체
  • 임시 객체의 하위 객체
  • 함수
  • 정적 또는 스레드 저장 기간을 가진 객체를 초기화하며 다음 조건 중 하나를 만족하는 경우:
  • 객체가 생성자 호출로 초기화되고, 초기화 전체 표현식이 상수 표현식인 경우 (단, 객체와 그 하위 객체에 대한 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; // 상수 표현식이 아님: 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에 대한 참조 바인딩이 상수 초기화 불가능했음 상수 초기화 가능함

참고 항목