초기화 목록과 함께 std::array 사용: 컴파일러 수수께끼
std::array와 함께 초기화 목록을 사용하는 구문은 다음과 같이 보일 수 있습니다. 간단하지만 일부 사용자는 이를 구현하려고 할 때 어려움을 겪었습니다. 질문에 제공된 예:
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>
쉼표 앞에 예기치 않은 토큰으로 인해 GCC 4.6.1에서 컴파일 오류가 발생합니다. 문제 없이 초기화 목록을 허용하는 std::벡터 동작의 이러한 불일치로 인해 구문의 유효성에 대한 혼란과 추측이 발생했습니다.
std::array의 본질 탐구
이러한 불일치를 이해하려면 std::array:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
이 정의에서 알 수 있듯이 std::array는 본질적으로 다음과 같은 구조체입니다. 배열을 포함합니다. 초기화 목록을 직접 받아들이는 생성자가 없습니다. 그러나 C 11의 규칙에 따르면 std::array는 집계로 간주됩니다. 이를 통해 배열 요소를 간접적으로 초기화하는 집계 초기화가 가능해집니다.
구문 수수께끼 극복
집계 초기화를 사용하여 std::array를 성공적으로 초기화하려면, 추가 중괄호 세트가 필요합니다.
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
중괄호를 중첩함으로써 컴파일러는 구조체 내의 배열 요소를 초기화하려는 의도를 인식합니다. 이렇게 하면 첫 번째 예에서 발생하는 컴파일 오류가 제거됩니다.
GCC 버그 또는 표준 불규칙성?
흥미롭게도 C 표준에서는 이 예제에서 추가 중괄호를 생략할 수 있음을 암시합니다. 특정 사례. 따라서 GCC 4.6.1에서는 단순화된 구문의 올바른 해석을 방해하는 버그가 발생할 가능성이 높습니다.
위 내용은 초기화 목록을 사용하여 std::array를 초기화하면 GCC 4.6.1에서 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!