C에서 이니셜라이저 목록은 집계 객체 또는 배열을 초기화하는 편리한 방법을 제공합니다. 그러나 std::array 및 집계 구조와 같은 특정 데이터 구조로 작업할 때 구문에 추가 중괄호가 필요하므로 많은 프로그래머가 그 이유를 궁금해합니다.
std::array는 집계 데이터 유형으로 선언되는 고정 크기 컨테이너입니다. 즉, 사용자 정의 생성자가 없습니다. 집계로서 std::array는 내부 배열을 포함하여 해당 멤버를 직접 초기화합니다.
내부 배열을 직접 초기화하려면 추가 중괄호가 필요합니다. 다음 예를 고려하십시오.
std::array<int, 2> a1 = {{0, 1}, {2, 3}};
여기서 {0, 1} 및 {2, 3} 주위의 중괄호는 초기화가 a1 내의 내부 배열에 대한 것임을 나타내기 때문에 필수적입니다. 이러한 중괄호가 없으면 너무 많은 초기화 프로그램으로 인해 코드에서 컴파일 오류가 발생합니다.
std::array와 달리 double과 같은 기본 유형은 그렇지 않습니다. 초기화 목록에 추가 중괄호가 필요합니다. 이는 집계가 아니기 때문입니다. 예:
std::array<double, 2> a2 = {0.1, 2.3};
이 경우 a2는 double 값의 배열입니다. double은 집계가 아니기 때문에 초기화에는 내부 배열이 포함되지 않으며 추가 중괄호가 필요하지 않습니다.
추가 중괄호에 대한 요구 사항은 std::array 이상으로 확장됩니다. . 집계와 관련된 다른 유형에도 필요합니다. 예를 들면 다음과 같습니다.
struct B { int foo[2]; }; B meow1 = {1, 2}; // OK (fully-braced) B bark1 = {{1, 2}}; // OK (extra braces for inner aggregate) struct C { int a, b; }; C meow2 = {1, 2}; // OK (completely elided braces) C bark2 = {{1, 2}}; // OK (extra braces for inner aggregate) struct D { int foo[2]; }; D meow3 = {{1, 2}, {3, 4}}; // error (neither braced-elided nor fully-braced) D bark3 = {{{1, 2}, {3, 4}}}; // OK (extra braces for inner aggregate)
요약하자면, std::array 및 특정 구조와 같은 집계를 초기화할 때 초기화 목록에 추가 중괄호가 필요합니다. 왜냐하면 내부 배열의 초기화를 나타내기 때문입니다. 집계의 구성원입니다. 이러한 차이점을 이해하는 것은 컴파일 오류를 방지하고 해당 데이터 구조의 올바른 초기화를 보장하는 데 중요합니다.
위 내용은 C 이니셜라이저 목록에 추가 중괄호가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!