다음 코드를 시각적 C 2010에서 컴파일 할 때 오류 메시지가 생성됩니다.
struct a. { int foo; 더블 바; }; std :: 배열 a1 = // 오류 C2078 : 너무 많은 이니셜 라이저 { {0, 0.1}, {2, 3.4} }; // 좋아요 std :: array오류는 A1에 대한 초기화기가 너무 많다는 것을 나타냅니다. 그러나 A2의 외부 브레이스를 생략해도 오류가 발생하지 않습니다. 이 불일치는 A1에 대한 외부 브레이스가 필요한 이유에 대한 의문을 제기하지만
struct A { int foo; double bar; }; std::array a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::arraya2 = {0.1, 2.3};
이 차이점을 이해하는 열쇠는 std :: 어레이의 특성에 있습니다. STD :: 배열은 집계 및 일반 기존 데이터 유형 (POD)으로 분류되는 반면 다른 표준 라이브러리 컨테이너는 그렇지 않습니다. 사용자 정의 생성자가있는 컨테이너와 달리 std :: 배열에는 하나가 없습니다. 첫 번째 데이터 멤버는 템플릿 인수로 지정된 크기 N 배열입니다. 이 데이터 멤버는 이니셜 라이저 목록을 사용하여 직접 초기화됩니다. 초기화되는 내부 배열을 둘러싸기 때문에 추가 버팀대가 필요합니다.
이 개념을 더 설명하기 위해 다음과 같이 정의 된 사용자 정의 집계 유형 AARRAY를 고려하십시오. 구조 Aarray { 데이터 [2]; // 내부 배열 };
struct A { int foo; double bar; }; std::array a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::array이 구조 초기화 초기화 초기화 내부 배열의 시작과 끝을 나타 내기 위해 버팀대를 사용해야합니다.a2 = {0.1, 2.3};
aarray a1 = { {// 내부 배열의 초기화를 시작합니다 {// 내부 배열의 첫 번째 요소를 초기화합니다. 0, 0.1 }, // 첫 번째 요소의 초기화를 종료합니다 {2, 3.4} // 내부 배열의 두 번째 요소를 초기화합니다. } // 내부 배열의 초기화를 종료합니다 }; // 오류 : 버팀대를 사용하지 않으면 너무 많은 초기화기 Aarray B1 = { 0, 0.1, 2, 3.4 };
struct A { int foo; double bar; }; std::array a1 = // error C2078: too many initializers { {0, 0.1}, {2, 3.4} }; // OK std::arraya2 = {0.1, 2.3};
double
의 경우 std :: array
std::arraya2 = {0.1, 2.3};
Clarification on Brace Usage
The C standard provides guidelines regarding the use of braces in initializer lists. C 11 사양의 섹션 §8.5.1/11은 초기화 목록이 왼쪽 브레이스로 시작하면 각 후속 쉼표로 구분 된 초기 조명 목록은 하위 응집체의 구성원을 초기화한다고 명시합니다. 반면에, 하위 집계의 초기화 목록이 왼쪽 브레이스로 시작되지 않으면, 다음 집계 멤버를 초기화하는 나머지 초기화 조명이 초기화되기 위해 충분한 초기화 조항 만 취해집니다. 이러한 유형에는 사용자 정의 생성자가없고 내부 배열이 직접 초기화되기 때문에 STD :: 배열과 같은 POD 구조. 반면, 원시 유형의 경우, 원시 값이 골재 내에서 직접 초기화되므로 외부 버팀대를 생략 할 수 있습니다. 이러한 경우의 차이를 이해함으로써 프로그래머는 올바른 초기화를 보장하고 컴파일러 오류를 피할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3