제 질문은 std::initializer_list
유형 사이의 변환이 부족하다는 것입니다. 제 질문은 이러한 변환이 쉽게 수행 할 수있을 때 포함 된 유형이 어느 정도 자격이 있는지입니다. 이제 std::optional
을 고려하고 말도 유형 무시std :: initializer_list <int const> std :: initializer_list에서 생성 할 수 없습니다 <int>
std::initializer_list<int> x{1,2,3,4,5,6};
std::initializer_list<int const> y = x; // error! cannot convert!
: 언어 스펙이 아닌 이력서는 U
년대 자격을 추론 필요
std::optional<std::vector<int>> x{std::in_place, {1,2,3,4,5}}; // OK
std::optional<std::vector<int const>> y{std::in_place, {1,2,3,4,5}}; // error!
내가 가정 을
이 잘못 다음 코드를 고려 기본값은 std::initializer_list<U>
입니다.
는 지금까지 내가 말할 수있는, std::initializer_list
생성자 오버로드를 가진 std::optional
(그리고 std::any
및 std::variant
)의 전체 포인트는 초기화 목록의 정확한 유형을 지정하지 않도록하는 것입니다. 위 코드의 두 번째 줄을 컴파일하려면, 정확히 수행해야합니다.
std::initializer_list
은 이미 데이터 (libc++
에 있음)에 이미 const*
을 보유하고 있습니다. 위의 코드가 작동하지 않는 것을 볼 수있는 이유는 무엇입니까? 이 문제가 언어에서 해결 가능한 문제입니까, 아니면 뭔가 빠졌습니까?
그것은 "어리석은 유형 무시"하드 가지의 때'벡터': 당신이
MyContainer<T const>
을 지원하는 당신의 자신의 종류MyContainer
을 작성하는 경우, 그때 당신이 다음과 같이 할 것을 제안 C + +에서는 명시 적으로 * 합법적이지 않습니다. 그렇다면 정확히'initializer_list'이 제대로 작동 할 것이라고 기대하십니까? 무엇으로 초기화할까요? –
솔직히 말하면, 나는 모른다. 내가 이것을 발견했을 때 일반적인 래퍼 유형을 쓰고 있었다. – xcvr
아마도 'dynarray'와 비슷한 유형의 경우에는 의미가 있습니다. – xcvr