std::initializer_list
- ko.cppreference.net
(멤버 초기화 목록과 혼동하지 마십시오))
template< class T >
class initializer_list;
|
(C++11부터)에 정의됨 | |
타입 std::initializer_list<T>의 객체는 타입 const T의 객체 배열(읽기 전용 메모리에 할당될 수 있음)에 대한 접근을 제공하는 경량 프록시 객체입니다.
다음과 같은 경우에 std::initializer_list 객체가 자동으로 생성됩니다:
- 해당 생성자가 매개변수를 받는 경우, 중괄호로 묶인 초기화 목록을 사용하여 객체를 목록 초기화
std::initializer_list할 때 - 해당 대입 연산자/함수가 매개변수를 받는 경우, 중괄호로 묶인 초기화 목록을 대입의 오른쪽 피연산자 또는 함수 호출 인수
std::initializer_list로 사용할 때 - auto에 중괄호로 묶인 초기화 목록을 바인딩할 때 (범위 기반 for 루프 포함).
std::initializer_list는 포인터 쌍 또는 포인터와 길이로 구현될 수 있습니다. std::initializer_list을 복사해도 해당 초기화 목록의 지원 배열이 복사되지는 않습니다.
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
(함수 템플릿) |
|
|
(C++11)
|
std::end
를 특수화
std::end
(함수 템플릿) |
|
|
|
(C++14)
|
컨테이너나 배열의 시작 부분에 대한 역방향 반복자를 반환
(함수 템플릿) |
|
(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)
|
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿) |
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |