부분적인 집계 초기화 및 비정적 데이터가 회원 이니셜라이저
문제
struct Point {
int x = 0;
int y = 10;
};
Point p = {1,};
p.x == 1; // true
p.y == 10; // is this true?
표준에 따라 누락된 요소에 초 목록은 값을 초기화 y
야 int()
나 0
, 지만,그것은 보이지 않는 말은 무슨 일이 일어날는 상황에서의 정적이 아닌 데이터가 회원 이니셜라이저입니다.
편집:에 따라,대답을 분명히 이것은 잘못된 c++11,알고 싶 상황에서는 c++1y.
해결책
C++98,C++03
정적이 아닌 데이터 구성원 initialisers(NSDMIs)존재하지 않는다;질문에 적용 되지 않.
C++11
먼저,이 초기화가 잘못되었기 때문에 당신의 유형이 집계:
[C++11: 8.5.1/1]:
는 집계 배열이나 클래스 (9 절) 가 사용자 제공 생성(12.1), no 중괄호 또는 동등 이니셜라이저 에 대한 정적이 아닌 데이터 구성원 (9.2),전용 또는 보호되는 정적이 아닌 데이터 멤버(11 절), 기본 클래스(10 절),그리고 가상의 함수(10.3).
그래서,집계 초기화를 수행할 수 없기;생성자를 복용 std::initializer_list
될 것입하는 방법을 사용하는 초기화 구문([C++11: 8.5.4/3]
어),하지만 당신은 하나도 없이 그 중 하나.
따라서,전체제의 문제는 흠이 있:그것은 가능하지 않은 자신을 얻으로 이 상태입니다.
C++1y
향후 버전에서의 기준,정의의 집계되었습 완화하도록 허용 입력하기로 간주합니다 집계 (한 두 사람의 회원은 숙박 public
!):
[n3936: 8.5.1/1]
는 집계 배열이나 클래스 (9 절)없이 사용자가 제공 생성(12.1), 전용 또는 보호되는 정적이 아닌 데이터 구성원 (11 절),아니한 기본 클래스(10 절),그리고 가상의 함수(10.3).
다음에서,이것이 규칙을 보장하는 결과를 찾:
[n3936: 8.5.1/7]
:수가 적은 경우 이니셜라이저-항 목록에서 구성원이 있는 것보다 집계,다음 각 회원이 명시적으로 초기화하여 초기화될서 중괄호 또는 동등 이니셜라이저 거나,없을 경우 중괄호 또는 동등 이니셜라이저, 서 이니셜라이저 목록(8.5.4). [예:struct S { int a; const char* b; int c; int d = b[a]; }; S ss = { 1, "asdf" };
초기화
ss.a
가1
,ss.b
가"asdf"
,ss.c
의 값으로 표현의 양식int{}
(즉,0
고),ss.d
의 값으로ss.b[ss.a]
(즉,’s’
다),그리고struct X { int i, j, k = 42; }; X a[] = { 1, 2, 3, 4, 5, 6 }; X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } };
a
고b
값이 동일 예제]
다른 팁
(답변서 유효한 C++1y, 만!)
절에 따라#7 절"8.5.1Aggregates"(Working Draft N3691 날짜:2013-05-16)
7 이 있는 경우 적은 이니셜라이저-절 목록에서 보기 회원은 업계 표준이며,다음 각 회원이 명시적으로 초기화 야에서 초기화는 그 보조기 또는 동등 이니셜라이저거나가있는 경우, 더 브레이 또는 equalinitializer,서 이니셜라이저 목록 (8.5.4).
아래 인용가 예제
[ Example: struct S { int a; const char* b; int c; int d = b[a]; };
S ss = { 1, "asdf" };
initializes ss.a with 1, ss.b with "asdf", ss.c
with the value of an expression of the form int{} (that is, 0), and
ss.d with the value of ss.b[ss.a] (that is, ’s’),
그래서 당신의 예 p.y 것입에 의해 초기화 10.