C ++ 11 이전에는 정수 또는 열거 형의 정적 const 멤버에 대해서만 클래스 내 초기화를 수행 할 수있었습니다. Stroustrup은 C ++ FAQ에서 이에 대해 설명 하며 다음 예제를 제공합니다.
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
그리고 다음과 같은 추론 :
그렇다면 이러한 불편한 제한이 존재하는 이유는 무엇입니까? 클래스는 일반적으로 헤더 파일에서 선언되고 헤더 파일은 일반적으로 많은 변환 단위에 포함됩니다. 그러나 복잡한 링커 규칙을 피하기 위해 C ++에서는 모든 개체에 고유 한 정의가 있어야합니다. C ++에서 객체로 메모리에 저장해야하는 엔티티의 클래스 내 정의를 허용하면이 규칙이 깨집니다.
그러나 C ++ 11은 이러한 제한을 완화하여 비 정적 멤버의 클래스 내 초기화를 허용합니다 (§12.6.2 / 8).
비 위임 생성자에서 지정된 비 정적 데이터 멤버 또는 기본 클래스가 mem-initializer-id에 의해 지정되지 않은 경우 ( 생성자에 ctor-initializer 가 없기 때문에 mem-initializer-list 가없는 경우 포함 ) 엔티티가 추상 클래스 (10.4)의 가상 기본 클래스가 아닌 경우
- 엔티티가 brace-or-equal-initializer 가있는 비 정적 데이터 멤버 인 경우 엔티티는 8.5에 지정된대로 초기화됩니다.
- 그렇지 않으면 엔티티가 변형 멤버 (9.5)이면 초기화가 수행되지 않습니다.
- 그렇지 않으면 엔티티가 기본으로 초기화됩니다 (8.5).
섹션 9.4.2는 또한 constexpr
지정자 로 표시된 경우 상수가 아닌 정적 멤버의 클래스 내 초기화를 허용 합니다.
그렇다면 C ++ 03에서 제한 한 이유는 어떻게 되었습니까? 단순히 "복잡한 링커 규칙"을 받아들이거나이를 구현하기 쉽게 만드는 다른 변경 사항이 있습니까?