2017-12-20 8 views
4

이와 같은 이니셜 라이저 목록을 사용하여 :C++ 컴파일러는이 초기화 프로그램 목록으로 무엇을합니까?

for (int i : {3, 1, 6, 4}) 
{ 
    std::cout << "i=" << i << std::endl; 
} 

OUPUT가, 같은 순서로 3 1, 6, 마지막 4. 그래서 컴파일러는 std::vector<int> 아니라 비슷한을 사용하고 있어야합니다 알고 std::set<int>.

보장 되나요? 컴파일러에서 {3, 1, 6, 4}을 어떻게 해석해야하는지 설명하는 문서는 어디에서 찾을 수 있습니까?

+3

http://en.cppreference.com/w/cpp/utility/initializer_list – Fureeish

+2

현재 표준에서. 다운로드 가능한 초안에 대한 [link] (http://en.cppreference.com/w/cpp/links)입니다. – Ron

답변

6

귀하의 range based loopstd::initializer_list<int> 임시 개체를 구성하는 범위 표현으로 braced-init-list을 사용하고 있습니다. 8.5.4.5 때문에 주문이 보장됩니다. n4140 draft/standard 상태 단락 (강조 광산) 구현이 N 소자 임시 배열을 할당 것처럼

형 STD의 목적 :: initializer_list <E>는 초기화리스트로 구성된다 타입 E의 타입. 여기서 N은 초기화리스트에있는 엘리먼트의 수이다.

9

std::initializer_list<int> 인스턴스를 만듭니다. 자세한 내용은 http://en.cppreference.com/w/cpp/utility/initializer_list을 참조하십시오. 해당 페이지에서

:

std::initializer_list<T>의 목적 const T 유형의 오브젝트의 어레이에 대한 액세스를 제공하는 경량 프록시 객체이다.

출력 순서가 보장됩니다. 그러나 컴파일러가 std::vector<int>을 생성하기 때문이 아닙니다. initializer_list 아래에 int의 배열이 있으므로이 값이 보장됩니다.

+0

사이드 질문 :'std :: initializer_list'의 생성자가'const T *'를 취하기 때문에, 컴파일러는 어떻게'T []'의 수명을 관리합니까? 그 임시 어딘가의 주소를 가지고 있지 않거나 특수한 경우로서 컴파일러에 의해 직접 처리되는 코드가 있는가? (범위 기반의 경우와 마찬가지로?) 이것이 의미가 있는지 확실하지 않습니다. –

+1

@ n.caillou, 생성자는'const T *'를 입력으로 사용하지 않습니다. 컴파일러는 컴파일시에 토큰을 처리하고 올바른 크기의'std :: initializer_list '유형의 객체를 생성하기위한 코드를 생성합니다. –

+0

질문 - 컴파일러가 특별한 경우로 취급하는 이러한 종류의 대답을 추측 할 수 있습니다. 그러나 GCC의 경우 최소한 개인 생성자 인 initializer_list (T * arr, size_t len)가 필요합니다. 또한'std :: initializer_list'는 카피 가능하게 보이지만 배열을 복사하지는 않습니다. 어쨌든, 기본 배열보다 주어진다면, 그 수명은 어떻게 든 관리되어야합니다. –

관련 문제