이번 글은 std::intializer_list 생성자에 대한 글입니다!
C++11부터 지원된 문법이며 '경량 프록시 오브젝트(lightweight proxy objet)'라고 합니다.
'프록시'에 대한 부분은 https://d-yong.tistory.com/49 해당 블로그를 참고해주세요!
간단하게 말하면 뭔가 '대리인 객체'? 대신 생성해주는 느낌으로 이해하시면 될꺼같습니다.
왜냐하면 std::initalizer_list가 실제 리스트 요소를 포함 하지는 않고, 리스트의 요소에 대한 포인터를 포함하고 있기 때문입니다.
문법은 아래처럼 '중괄호'를 통해 빠르고 간편하게 std::vector를 초기화 할 수 있게 되었습니다.
std::vector<int> vec = {1, 2, 3};
주의할 점은
- 생성자들 중에 initializer_list를 받는 생성자가 있다면 해당 생성자가 '최우선적'으로 고려된다는 점입니다.
- '데이터 손실'이 발생할 수 있는 경우에는 컴파일 에러가 발생할 수 있습니다.
initializer_list를 받는 생성자와 인자(정수)를 하나 받는 생성자가 둘 다 존재하는 경우 아래처럼 생성하게 되면 initializer_list에서 인자를 하나를 받는 생성자를 호출하게 됩니다.
std::vector<int> vec{10};
또한 std::initializer_list는 [ ] 대괄호 연산자를 지원하지 않고
멤버함수로 size(), begin(), end()를 지원합니다!
std::begin(), std::end()가 아닙니다!
또한 rbegin(), crbegin(), rend(), crend(), empty(), data()와 같은 함수들도 지원이 안됩니다.
정리하자면,
- initializer_list를 받는 생성자가 있으면 다른 생성자들과 구분해서 사용하자!
- 지원되지 않는 연산자들이나 함수들이 있다.(ex [ ] 연산자)
- 잘 사용하자 ㅎㅎ
감사합니다 :)
참고한 자료
https://en.cppreference.com/w/cpp/utility/initializer_list
'CPP' 카테고리의 다른 글
[C++] 스마트 포인터 (0) | 2023.09.14 |
---|---|
[C++] union (DX Matrix) (0) | 2023.09.04 |
[C++] 가변 길이 템플릿과 후행 리턴 타입 (0) | 2023.08.20 |
[C++] boost 라이브러리 설치 방법 (0) | 2023.08.17 |
[C++] constexpr (0) | 2023.08.17 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!