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

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

DDD
풀어 주다: 2024-10-29 09:51:30
원래의
582명이 탐색했습니다.

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in GCC 4.6.1?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿