Development Tip

C ++ 11 : 올바른 std :: array 초기화?

yourdevel 2020. 12. 12. 12:33
반응형

C ++ 11 : 올바른 std :: array 초기화?


std :: array를 다음과 같이 초기화하면 컴파일러에서 중괄호 누락에 대한 경고를 표시합니다.

std::array<int, 4> a = {1, 2, 3, 4};

이렇게하면 문제가 해결됩니다.

std::array<int, 4> a = {{1, 2, 3, 4}};

다음은 경고 메시지입니다.

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]

내 버전의 gcc에있는 버그 일 뿐입니 까, 아니면 의도적으로 수행 되었습니까? 그렇다면 그 이유는 무엇입니까?


이것은 베어 구현입니다 std::array.

template<typename T, std::size_t N>
struct array {
    T __array_impl[N];
};

{}내부 배열을 초기화하는 데 내부 가 사용되도록 데이터 멤버 만 기존 배열 인 집계 구조체입니다 .

중괄호 제거는 집계 초기화 (일반적으로 권장되지 않음)와 함께 특정 경우에 허용되므로이 경우에는 중괄호를 하나만 사용할 수 있습니다. 여기 참조 : C ++ 벡터 배열


cppreference 에 따르면 . =생략 된 경우에만 이중 중괄호가 필요합니다 .

// construction uses aggregate initialization
std::array<int, 3> a1{ {1,2,3} };    // double-braces required
std::array<int, 3> a2 = {1, 2, 3}; // except after =
std::array<std::string, 2> a3 = { {std::string("a"), "b"} };

CWG 1270 이전의 C ++ 11에는 이중 중괄호가 필요합니다 (개정 후 C ++ 11 및 C ++ 14 이상에서는 필요하지 않음) :

// construction uses aggregate initialization
std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision
                                    // (not needed in C++11 after the revision and in C++14 and beyond)
std::array<int, 3> a2 = {1, 2, 3};  // never required after =

std :: array 참조

참고 URL : https://stackoverflow.com/questions/14178264/c11-correct-stdarray-initialization

반응형