2017-01-10 1 views
3

제 질문은 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::anystd::variant)의 전체 포인트는 초기화 목록의 정확한 유형을 지정하지 않도록하는 것입니다. 위 코드의 두 번째 줄을 컴파일하려면, 정확히 수행해야합니다.

std::initializer_list은 이미 데이터 (libc++에 있음)에 이미 const*을 보유하고 있습니다. 위의 코드가 작동하지 않는 것을 볼 수있는 이유는 무엇입니까? 이 문제가 언어에서 해결 가능한 문제입니까, 아니면 뭔가 빠졌습니까?

+3

그것은 "어리석은 유형 무시"하드 가지의 때'벡터 ': 당신이 MyContainer<T const>을 지원하는 당신의 자신의 종류 MyContainer을 작성하는 경우

, 그때 당신이 다음과 같이 할 것을 제안 C + +에서는 명시 적으로 * 합법적이지 않습니다. 그렇다면 정확히'initializer_list '이 제대로 작동 할 것이라고 기대하십니까? 무엇으로 초기화할까요? –

+0

솔직히 말하면, 나는 모른다. 내가 이것을 발견했을 때 일반적인 래퍼 유형을 쓰고 있었다. – xcvr

+0

아마도 'dynarray'와 비슷한 유형의 경우에는 의미가 있습니다. – xcvr

답변

3

당신의 질문처럼 들리는 이유는 std::initializer_list<T const>std::initializer_list<T>에서 건설 될 수 없다는 것입니다. 사실 이러한 변환을 구현하기 쉽습니다.

내가 대답은 당신이 처음에 std::initializer_list<T const>을 가져야한다고 생각하지 않는다는 것입니다. 당신이 말했듯이, std::initializer_list<T>은 어쨌든 const에만 액세스를 제공합니다.

그러므로 C++에는 std::initializer_list<T const> 인수가 필요한 생성자가 없어야한다는 "문화적 규범"이 있다고 할 수 있습니다. 예를 들어, 표준 라이브러리 컨테이너는 어쨌든 cv 규정 값 유형이 올바르지 않기 때문에 (아무튼 사용자 정의 생성자가없는 std::array의 경우 제외).

template <class T> 
class MyContainer { 
    public: 
    MyContainer(std::initializer_list<std::remove_cv_t<T>> il); 
    // ... 
}; 
+0

"문화적 규범"이 맞는 것 같습니다.누군가 (여러분?)이'std :: initializer_list '과 같은 의미를 가지고 있다면 모든 초기화리스트가 왜 'std :: initializer_list '이 될지 추론 할 수없는 경우를 대비해서 이것을 열어 두겠습니다. – xcvr

+1

@xcvr 왜냐하면'std :: initializer_list'의 템플릿 인자는 템플릿 인수 공제의 일반적인 규칙을 사용하여 추론되기 때문에 cv 검증 유형, 참조 유형, 배열 유형 또는 함수 유형을 추론하지 않기 때문입니다. – Brian

+0

템플릿 인자 추론의 일반적인 규칙은 'std :: initializer_list '으로 지정하지 않으면 유형을 추론 할 수없는 경우 창 밖으로 나옵니다. – xcvr

관련 문제