부분적인 집계 초기화 및 비정적 데이터가 회원 이니셜라이저

StackOverflow https://stackoverflow.com//questions/24043577

  •  21-12-2019
  •  | 
  •  

문제

struct Point {
  int x = 0;
  int y = 10;
};

Point p = {1,};
p.x == 1;  // true
p.y == 10; // is this true?

표준에 따라 누락된 요소에 초 목록은 값을 초기화 yint()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.a1, 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 } };

ab 값이 동일 예제]

다른 팁

(답변서 유효한 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top