"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > `std::array`에 초기화 목록에 이중 중괄호가 필요한 이유는 무엇입니까?

`std::array`에 초기화 목록에 이중 중괄호가 필요한 이유는 무엇입니까?

2024년 11월 20일에 게시됨
검색:737

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

초기화 목록 동작: std::벡터와 std::array의 차이점

std::벡터와 std::array는 C의 두 컨테이너 모두 초기화 목록의 동작이 다릅니다. 이 기사에서는 집계 초기화의 복잡성을 살펴보고 std::array에 이중 중괄호가 필요한 이유를 이해합니다.

std::벡터 및 std::를 초기화하는 다음 코드 조각을 고려하세요. 배열:

std::vector x{1,2,3,4};
std::array y{{1,2,3,4}};

std::벡터 초기화

std::벡터 지원 std::initializer_list를 허용하는 생성자를 포함한 사용자 정의 생성자. 따라서 추가 중괄호 없이도 중괄호를 사용하여 x를 직접 초기화할 수 있습니다.

std::array 초기화

std::벡터, std::array와는 달리 사용자 정의 생성자가 없는 집계입니다. 대신 C에서 상속된 기능인 집계 초기화에 의존합니다.

"이전 스타일" 집계 초기화에서는 등호와 콜론이 사용됩니다:

std::array y = { { 1, 2, 3, 4 } };

그러나 직접 목록 초기화(C 11에서 도입됨)를 사용하는 경우 이 = 구문은 더 이상 유효하지 않습니다. 또한 추가 중괄호 생략을 허용하는 중괄호 제거는 이전 스타일 = 구문을 사용하는 선언에서만 허용됩니다. 직접 목록 초기화의 경우 추가 중괄호가 필수입니다.

CWG 결함

CWG 결함 보고서(CWG 결함 #1270)는 중괄호 제거를 허용하여 이 제한 사항을 해결하는 것을 목표로 합니다. 다른 형태의 목록 초기화. 채택되면 다음 코드가 잘 구성됩니다.

std::array y{ 1, 2, 3, 4 };

결론적으로, 이니셜라이저 목록이 있는 std::Vector와 std::array 사이의 동작은 각각 사용자 정의 생성자가 있는 클래스와 집계 초기화에 의존하는 집계라는 기본 특성에서 비롯됩니다. std::array가 집계 초기화 규칙을 따르려면 이중 중괄호가 필요하며, std::Vector는 이전 스타일 집계 초기화 구문에 의존하지 않고 단일 중괄호 세트를 사용하여 직접 초기화를 허용합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3