"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C ++ 집계 유형 초기화 목록에는 언제 외부 버팀대가 필요합니까?

C ++ 집계 유형 초기화 목록에는 언제 외부 버팀대가 필요합니까?

2025-04-14에 게시되었습니다
검색:655

When are Outer Braces Necessary in C   Initializer Lists for Aggregates?

다음 코드를 시각적 C 2010에서 컴파일 할 때 오류 메시지가 생성됩니다.

struct a. { int foo; 더블 바; }; std :: 배열 a1 = // 오류 C2078 : 너무 많은 이니셜 라이저 { {0, 0.1}, {2, 3.4} }; // 좋아요 std :: array a2 = {0.1, 2.3};

오류는 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::array a2 = {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::array a2 = {0.1, 2.3};

double

의 경우 std :: array 의 경우, 이중은 집계 유형이 아니기 때문에 상황은 다릅니다. 대신, std :: array 는 프리미티브의 집계로 간주됩니다. The following code is valid without outer braces because the primitive values ​​are directly initialized within the aggregate:

std::array a2 = {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