초기화 목록과 함께 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::array
C ++ 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
'programing' 카테고리의 다른 글
PDO bindParam 대 실행 (0) | 2021.01.15 |
---|---|
모니터 (DDMS) 도구를 사용하여 애플리케이션을 디버그하는 방법 (0) | 2021.01.15 |
Javascript removeEventListener가 작동하지 않습니다. (0) | 2021.01.14 |
경로를 연결하는 기능? (0) | 2021.01.14 |
부정의 인스턴스 (0) | 2021.01.14 |