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 스타일 멤버 배열 용).
'IT박스' 카테고리의 다른 글
MySQL TEXT vs BLOB vs CLOB (0) | 2020.11.12 |
---|---|
GNU는 공백이있는 파일 이름을 처리 할 수 있습니까? (0) | 2020.11.12 |
$ .each () 대 for () 루프-및 성능 (0) | 2020.11.12 |
Eclipse : 리소스가 Java 프로젝트의 빌드 경로에 없습니다. (0) | 2020.11.11 |
Mono로 .net 앱을 실행할 수 없음-mscorlib.dll을 찾을 수 없음 (버전 불일치?) (0) | 2020.11.11 |