您能解釋STL容器如何處理具有空初始化程序列表的賦值運算符?賦值運算符爲空inizializer_list
時我會做這樣的事情:
vector<int> v;
v = { };
被調用的函數是不:
vector& operator= (initializer_list<value_type> il);
但:
vector& operator= (vector&& x);
,另一方面,當我會做類似於我自己的課程:
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
如果列表不是空的,它工作得很好,它只是調用與初始化列表的功能。只有當列表爲空時,纔會出現問題,它在向量上調用右值賦值運算符,在我的類上出現錯誤。
如何在矢量和其他容器中處理這種情況?
無論'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