>백엔드 개발 >C++ >초기화 목록을 사용하여 std::array를 초기화할 때 컴파일 오류가 발생하는 이유는 무엇입니까?

초기화 목록을 사용하여 std::array를 초기화할 때 컴파일 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-29 08:15:30727검색

Why Do I Get Compilation Errors When Initializing a std::array with an Initializer List?

초기화 목록과 함께 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.