programing

초기화 목록과 함께 std :: array 사용

coolbiz 2021. 1. 14. 23:01
반응형

초기화 목록과 함께 std :: array 사용


내가 착각하지 않는 한 다음과 같은 방법으로 std : array를 생성 할 수 있어야합니다.

std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });

그러나 GCC 4.6.1을 사용하면 이들 중 어느 것도 작동하지 않습니다. 컴파일러는 단순히 다음과 같이 말합니다.

expected primary-expression before ',' token

그러나 초기화 목록은 std :: vector에서 잘 작동합니다. 그래서 그것은 무엇입니까? std :: array가 초기화 목록을 허용해야한다고 생각하는 것이 잘못된 것입니까? 아니면 GNU 표준 C ++ 라이브러리 팀이 망가 졌습니까?


std::array재미 있어요. 기본적으로 다음과 같이 정의됩니다.

template<typename T, int size>
struct std::array
{
  T a[size];
};

배열을 포함하는 구조체입니다. 이니셜 라이저 목록을 사용하는 생성자가 없습니다. 그러나 std::arrayC ++ 11의 규칙에 의한 집계이므로 집계 초기화로 생성 할 수 있습니다. 구조체 내부 에서 배열을 집계하여 초기화하려면 두 번째 중괄호 세트가 필요합니다.

std::array<std::string, 2> strings = {{ "a", "b" }};

표준은이 경우 추가 중괄호를 제거 할 수 있다고 제안합니다. 따라서 GCC 버그 일 가능성이 높습니다.


수락 된 답변에 추가하려면 :

std::array<char, 2> a1{'a', 'b'};
std::array<char, 2> a2 = {'a', 'b'};
std::array<char, 2> a3{{'a', 'b'}};
std::array<char, 2> a4 = {{'a', 'b'}};

모두 GCC 4.6.3 (Xubuntu 12.01)에서 작동합니다. 하나,

void f(std::array<char, 2> a)
{
}

//f({'a', 'b'}); //doesn't compile
f({{'a', 'b'}});

위의 경우 컴파일하려면 이중 중괄호가 필요합니다. 중괄호가 하나 인 버전은 다음 오류를 발생시킵니다.

../src/main.cc: In function ‘int main(int, char**)’:
../src/main.cc:23:17: error: could not convert ‘{'a', 'b'}’ from ‘<brace-enclosed initializer list>’ to ‘std::array<char, 2ul>’

유형 추론 / 변환의 어떤 측면이 이러한 방식으로 작동하는지 또는 이것이 GCC 구현의 특성인지 잘 모르겠습니다.

참조 URL : https://stackoverflow.com/questions/8192185/using-stdarray-with-initialization-lists

반응형