std::array
, std::vector
및 중괄호 초기화가 완료되었으므로 C 스타일 배열이 여전히 필요합니까?C 스타일 어레이의 대안은 얼마나 실용적입니까?
답변
C 스타일 배열이 여전히 보유하고있는 것 중 하나는 std::array
입니다. 크기 공제가입니다. 당신은 but not really with std::array
, C 스타일 배열 다음을 수행 할 수 std::initializer_list
:
int arr[] = {1,2,3,4,5}; // no explicit size
이제, 우리는 또한 C 스타일 배열 교체에 대한 또 다른 후보가있다. 내부적으로, 그것은 배열과 같은 저장 장치의 일종으로 백업되지만 관찰 :
#include <initializer_list> // needed
// ...
auto list = {1,2,3,4,5}; // no explicit size, and no explicit type!
그리고 decltype(list) == std::initializer_list<int>
합니다. 그러나 현재 멤버 함수가 constexpr
으로 표시되지 않고 (C++ 14에서는 고정되어 있으므로) 컴파일시에 std::initializer_list
의 크기 나 요소를 쿼리 할 수 없습니다. 또한 더 큰 문제 : std::initializer_list
은 요소에 대해 const
- 액세스 만 제공하므로 변경할 수 없습니다.
그러나주의 : std::initializer_list
은 참조 의미 체계을 가지며 함수에서 반환 된 경우 저장소에 대한 참조가 포함될 것입니다.
결국 좁은 상황과 틈새 시장에서 C 스타일 배열을위한 장소가 있지만 일반적으로 std::array
및 std::initializer_list
과 같은 더 나은 옵션을 사용할 수 있습니다.
감사합니다. 좋은 답변입니다! 그래서 정확하게 이해한다면, 컴파일 타임에'initializer_list'의 크기를 쿼리 할 수있을 때,이 장점조차 사라지 겠지요? 다음 std :: array 반환 할 템플릿 함수를 디자인 할 수 및 크기 공제, 바로 가지고있다 같아요? – JohnnyW
아니요, 그렇지 않습니다. –
@AndyProwl은 좀 더 구체적 일 수 있습니다. 가능한 유스 케이스는 무엇입니까? – JohnnyW
@JohnnyW :'std :: array'에 무엇이 있다고 생각합니까? –