2013-06-18 6 views
3

std::array, std::vector 및 중괄호 초기화가 완료되었으므로 C 스타일 배열이 여전히 필요합니까?C 스타일 어레이의 대안은 얼마나 실용적입니까?

+1

아니요, 그렇지 않습니다. –

+0

@AndyProwl은 좀 더 구체적 일 수 있습니다. 가능한 유스 케이스는 무엇입니까? – JohnnyW

+1

@JohnnyW :'std :: array'에 무엇이 있다고 생각합니까? –

답변

12

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::arraystd::initializer_list과 같은 더 나은 옵션을 사용할 수 있습니다.

+0

감사합니다. 좋은 답변입니다! 그래서 정확하게 이해한다면, 컴파일 타임에'initializer_list'의 크기를 쿼리 할 수있을 때,이 장점조차 사라지 겠지요? 다음 std :: array 반환 할 템플릿 함수를 디자인 할 수 및 크기 공제, 바로 가지고있다 같아요? – JohnnyW