Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

( member initializer list 와 혼동하지 않음)

헤더 파일에 정의됨 <initializer_list>
template < class T >
class initializer_list ;
(C++11부터)

std::initializer_list<T> 타입의 객체는 const T 타입의 객체 배열에 대한 접근을 제공하는 경량 프록시 객체입니다(해당 배열이 읽기 전용 메모리에 할당될 수 있음).

A std::initializer_list 객체는 다음과 같은 경우에 자동으로 생성됩니다:

  • 중괄호로 둘러싸인 초기화 리스트가 객체를 목록 초기화 하는 데 사용되며, 해당 생성자가 std::initializer_list 매개변수를 받는 경우,
  • 중괄호로 둘러싸인 초기화 리스트가 할당 의 우측 피연산자로 사용되거나 함수 호출 인자 로 사용되며, 해당 할당 연산자/함수가 std::initializer_list 매개변수를 받는 경우,
  • 중괄호로 둘러싸인 초기화 리스트가 auto 에 바인딩되는 경우( 범위 기반 for 루프 포함).

std::initializer_list 는 한 쌍의 포인터 또는 포인터와 길이로 구현될 수 있습니다. std::initializer_list 를 복사하는 것은 해당 초기화 리스트의 backing array 를 복사하지 않습니다.

프로그램은 std::initializer_list 의 명시적 또는 부분 특수화를 선언할 경우 형식이 잘못되었습니다.

목차

멤버 타입

이름 정의
value_type T
reference const T &
const_reference const T &
size_type std::size_t
iterator const T *
const_iterator const T *

멤버 함수

빈 initializer list를 생성함
(public member function)
Capacity
initializer list의 요소 개수를 반환함
(public member function)
Iterators
첫 번째 요소를 가리키는 포인터를 반환함
(public member function)
마지막 요소의 다음을 가리키는 포인터를 반환함
(public member function)

비멤버 함수

std::begin 를 오버로드 std::begin
(함수 템플릿)
std::end 를 특수화 std::end
(함수 템플릿)
std::initializer_list 에 대해 오버로드된 자유 함수 템플릿
컨테이너나 배열의 시작 부분에 대한 역방향 반복자를 반환
(함수 템플릿)
(C++14)
컨테이너나 배열의 역방향 끝 반복자를 반환
(함수 템플릿)
(C++17)
컨테이너가 비어 있는지 확인
(함수 템플릿)
(C++17)
기본 배열에 대한 포인터를 얻음
(함수 템플릿)

참고 사항

기능 테스트 매크로 표준 기능
__cpp_initializer_lists 200806L (C++11) 목록 초기화 std::initializer_list

예제

#include <cassert>
#include <initializer_list>
#include <iostream>
#include <vector>
template<class T>
struct S
{
    std::vector<T> v;
    S(std::initializer_list<T> l) : v(l)
    {
         std::cout << "constructed with a " << l.size() << "-element list\n";
    }
    void append(std::initializer_list<T> l)
    {
        v.insert(v.end(), l.begin(), l.end());
    }
    std::pair<const T*, std::size_t> c_arr() const
    {
        return {&v[0], v.size()}; // return 문에서의 복사 목록 초기화
                                  // 이는 std::initializer_list의 사용이 아님
    }
};
template<typename T>
void templated_fn(T) {}
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // 복사 목록 초기화
    s.append({6, 7, 8});        // 함수 호출에서의 목록 초기화
    std::cout << "The vector now has " << s.c_arr().second << " ints:\n";    
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::cout << "Range-for over brace-init-list: \n";
    for (int x : {-1, -2, -3}) // auto에 대한 규칙으로 이 범위 기반 for가 작동함
        std::cout << x << ' ';
    std::cout << '\n';
    auto al = {10, 11, 12}; // auto에 대한 특별 규칙
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
    auto la = al; // 최상위 프록시 객체의 얕은 복사
    assert(la.begin() == al.begin()); // 보장됨: 백업 배열이 동일함
    std::initializer_list<int> il{-3, -2, -1};
    assert(il.begin()[2] == -1); // 존재하지 않는 operator[]의 대체물 참고
    il = al; // 얕은 복사
    assert(il.begin() == al.begin()); // 보장됨
//  templated_fn({1, 2, 3}); // 컴파일러 오류! "{1, 2, 3}"은 표현식이 아니며,
                             // 타입이 없으므로 T를 추론할 수 없음
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
    templated_fn<std::vector<int>>({1, 2, 3});           // 또한 OK
}

출력:

constructed with a 5-element list
The vector now has 8 ints:
1 2 3 4 5 6 7 8
Range-for over brace-init-list:
-1 -2 -3
The list bound to auto has size() = 3

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2129 C++11 std::initializer_list 가 명시적
특수화 또는 부분 특수화를 가질 수 있었음
이 경우 프로그램은
형식 오류를 가짐

참고 항목

(C++20)
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿)
읽기 전용 문자열 뷰
(클래스 템플릿)