본문 바로가기

# Lang/C++

6.3 이니셜라이져 리스트

 이니셜라이져 리스트 (Initializer_list)

여러개의 요소들을 하나의 리스트에 넣어서 생성자에 넘김.  (since C++11)

이 때, 해당 요소들은 전부 동일한 타입이어야 함.


내부적으로 std::initializer_list<T> 라는 자료형에 담겨서 전송됨.

즉, 해당 초기화 방식을 사용하려면 std::initializer_list<T>를 인자로 받는 생성자가 있어야 함.


example 1 :

std::initializer_list<int> list = {1, 2, 3};

vector<int> v1{list};		// v1 [1, 2, 3], call vector(initializer_list)
vector<int> v2(list);		// v2 [1, 2, 3], call vector(initializer_list)
vector<int> v3{1, 2, 3};	// v3 [1, 2, 3], call vector(initializer_list)
vector<int> v4(1, 2, 3);	// compile error, no constructor vector(int, int, int)


example 2:

class data {
private:
    int num[4];

public:
    data(std::initializer_list<int> list){
        uint32_t idx = 0;
        for(const int var : list){
            num[idx] = var;
            idx++;
        }
    }
};
data v1{1, 2, 3, 4};	// call data(initializer_list)
data v2({1, 2, 3, 4});	// call data(initializer_list)



 집합 초기화와 비교 (vs Aggregate initialization.)

이니셜라이져 리스트 :

  • 초기화 방식이 아님 (유틸리티에 가까움), copy initailization으로 동작함.

  • 다중인자를 std::initializer_list<T>에 넣어서 생성자에 전송.

  • 다중인자의 자료형은 모두 같아야 함.

  • std::initializer_list를 인자로 받는 생성자가 있어야 함.


중괄호 리스트 초기화 (집합 초기화) :

  • aggregate initialization.

  • 다중인자를 하나의 집합으로 취급하여 per copy initialize를 진행.

  • 다중인자의 자료형은 전부 달라도 됨.

  • 생성자가 없어도 됨. (단, 사용하는 C++버전의 제약조건을 지켜야 함.)


혼용하여 사용하면 initializer_list constructor를 우선적으로 호출한다. 

위는 gcc 기준이며, visual studio compiler에서의 처리방식은 위와 다를 수 있다.


example 1 :

class data {
public:
    int a;
    int b;
    data(int _a, int _b){
        cout << "call data(int, int)" << endl;
    }

    data(std::initializer_list<int> list){
        cout << "call data(initializer_list)" << endl;
    }
};
data a(1, 2);   // copy init, call data(int, int)
data b{1, 2};   // copy init, call data(initializer_list)


example 2 :

class data {
public:
    int a;
    int b;
};
data a(1, 2);   // compile error, no matching constructor.
data b{1, 2};   // aggregate init, 


example 3 :

vector<int> v1(2, 1);    // [1, 1], call vector(int, int)
vector<int> v2{2, 1};    // [2, 1], call vector(initializer_list)



 참고 문헌



'# Lang > C++' 카테고리의 다른 글

6.4 균일된 초기화 방식  (0) 2019.05.07
6.2 중괄호 리스트 초기화  (0) 2019.04.30
6.1 로컬변수 초기화  (0) 2019.04.22
5.2 완벽한 전달  (0) 2019.04.19
5.1 이동 의미론  (0) 2019.04.18