IT박스

std :: vector 및 std :: array에 대한 C ++ initializer_list 동작이 다른 이유는 무엇입니까?

itboxs 2020. 11. 12. 08:01
반응형

std :: vector 및 std :: array에 대한 C ++ initializer_list 동작이 다른 이유는 무엇입니까?


암호:

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

std :: array에 이중 중괄호가 필요한 이유는 무엇입니까?


std::array<T, N>집계입니다. 사용자가 선언 한 생성자가없고 std::initializer_list. 중괄호를 사용한 초기화 는 C에서 상속 된 C ++의 기능인 집계 초기화를 사용하여 수행 됩니다.

집계 초기화의 "이전 스타일"은 =다음을 사용합니다 .

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

이전 스타일의 집계 초기화를 사용하면 추가 중괄호가 제거 될 수 있으므로 다음과 같습니다.

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

그러나 이러한 추가 중괄호는 "양식 선언에서 T x = { a };"(C ++ 11 §8.5.1 / 11) 즉, 이전 스타일 =이 사용되는 경우 에만 제거 될 수 있습니다 . 중괄호 제거를 허용하는이 규칙은 직접 목록 초기화에는 적용되지 않습니다. 여기 각주는 "목록 초기화의 다른 용도에서 중괄호를 제거 할 수 없습니다."라는 내용입니다.

이 제한에 관한 결함 보고서가 있습니다. CWG 결함 # 1270 . 제안 된 해결 방법이 채택되면 다른 형식의 목록 초기화에 대해 중괄호 제거가 허용되며 다음이 올바르게 구성됩니다.

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

(결함 보고서를 찾기위한 Ville Voutilainen의 모자 팁.)


std::vector받는 생성자를 제공 하기 때문에 std::initializer_list<T>while std::array에는 생성자가 없으며 중괄호 {1, 2, 3, 4}init-list는 실제로으로 해석되지 std::initializer_list않지만 내부 C 스타일 배열에 대한 집계 초기화 std::array(즉, 두 번째 중괄호 집합의 출처 : One for std::array, 내부 C 스타일 멤버 배열 용).

참고 URL : https://stackoverflow.com/questions/11400090/why-is-the-c-initializer-list-behavior-for-stdvector-and-stdarray-differen

반응형