초기화 목록과 함께 std::array 사용: 구문 미스터리 해결
C 데이터 구조 영역에서 std::array는 고정된 크기의 메모리 할당을 사용합니다. 다재다능하여 초기화 목록을 사용하여 초기화할 수 있지만 예상치 못한 몇 가지 문제가 발생할 수 있습니다.
구문 수수께끼
쿼리에 따르면 std::array를 초기화하려고 시도합니다. 아래 그림과 같이 초기화 목록을 사용하면 컴파일 오류가 발생합니다.
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" }; std::array<std::string, 2> strings({ "a", "b" });</code>
그러나 초기화 목록은 std::Vector와 원활하게 작동합니다. 이러한 차이는 질문을 제기합니다. 이것이 std::array의 기능에 대한 오해입니까 아니면 GNU 표준 C 라이브러리 구현의 결함입니까?
솔루션 공개
장면에서 std::array는 구조체:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
로 구성됩니다. 이 구조는 배열을 캡슐화하지만 이상하게도 초기화 목록을 허용하는 생성자가 부족합니다. 그럼에도 불구하고 std::array는 C 11에서 집합체로 적합하므로 집합체 초기화가 대안적인 접근 방식이 됩니다.
집계 초기화를 수행하려면 구조체 내의 배열을 대상으로 하는 추가 중괄호 세트가 필요합니다.
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
컴파일러 이상
C 표준에서는 위 예의 추가 중괄호가 필요하지 않다고 제안합니다. 그러나 발생한 컴파일러 오류는 집계 초기화를 인식하지 못하는 GCC 구현의 잠재적인 버그를 암시합니다.
결론
이 문제는 처음에는 당황스러워 보일 수 있습니다. 한눈에, 핵심은 std::array의 기본 구조와 집계 초기화의 복잡성을 이해하는 데 있습니다. 이중 중괄호 구문은 컴파일 오류를 해결하고 C 표준의 의도에 따라 초기화 목록을 사용하여 std::arrays 생성을 허용합니다.
위 내용은 초기화 목록을 사용하여 std::array를 초기화할 때 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!