반응형
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 =
참고 URL : https://stackoverflow.com/questions/14178264/c11-correct-stdarray-initialization
반응형
'Development Tip' 카테고리의 다른 글
언제 Object.defineProperty ()를 사용합니까? (0) | 2020.12.12 |
---|---|
C의 템플릿 시뮬레이션 (큐 데이터 유형용) (0) | 2020.12.12 |
Python 유니 코드 동등 비교 실패 (0) | 2020.12.12 |
정적 코드 분석 도구 선택 (0) | 2020.12.12 |
Firefox 및 SSL : sec_error_unknown_issuer (0) | 2020.12.12 |