STL 컨테이너가 빈 이니셜 라이저 목록이있는 대입 연산자를 처리하는 방법을 설명 할 수 있습니까?할당 연산자가 빈 inizializer_list에 있음
나는 같은 것을 할 것입니다 때 다른 한편으로
vector& operator= (vector&& x);
:
vector<int> v;
v = { };
호출되는 함수입니다 하지 :
vector& operator= (initializer_list<value_type> il);
하지만를 , 내 자신의 수업과 비슷한 것을 할 때 :
struct A {
A& operator= (const A&) { return *this; }
A& operator= (A&&) { return *this; }
A& operator= (initializer_list<int>) { return *this; }
};
/* ... */
A a;
a = { };
코드는 VS2013에서 컴파일하고 말한다하지 않습니다 목록이 비어 있지
error C2593: 'operator =' is ambiguous
경우, 잘 작동, 그냥 초기화 목록과 함수를 호출합니다. 문제는 목록이 비어있을 때만 나타납니다. 벡터에서 rvalue 할당 연산자를 호출합니다. 클래스에 오류가 발생합니다.
이 상황이 벡터 및 다른 컨테이너에서 어떻게 처리됩니까?
어느'gcc'도'clang'는이 같은 오류 :
업데이트
이 관련된 두 개의 활성 버그가있는 것 같은데 그러나 [vs] (http://rextester.com/ZWD57818)의 오류를 확인했습니다. –
[재생할 수 없습니다] (http://coliru.stacked-crooked.com/a/cd78ac29f69fdc05). – Shoe
g ++와 clang ++는'operator ='의 오버로드 인 initializer_List을 모호하지 않게 선택합니다. 나는 이것이 정확하다고 생각한다 : [over.ics.list]에 따르면,이 오버로드의 변환 등급은 완전 일치해야한다. 참조 오버로드의 경우 임시 (임시)가 만들어 져야하므로 참조 (아마도)는 직접 바인딩되지 않습니다. 따라서 변환 순서는 사용자 정의 변환입니다. (여기에 [over.ics.ref]가 정의되어 있고 list-init은 언급되어 있지 않다는 점을 참고하십시오.) –
dyp