你能解释一下STL容器如何使用空的初始化列表处理赋值运算符?
@H_404_27@解决方法
当我做这样的事情:
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
如果列表不为空,它工作正常,它只是用初始化列表调用函数.只有当列表为空时才会出现问题,在向量上调用rvalue赋值运算符,在我的类上它会给出错误.
如何在向量和其他容器中处理这种情况?
这似乎是一个bug clang(
see it live)和gcc(
see it live)接受这个程序并选择std :: initializer_list重载看起来是正确的,因为这是完全匹配,这在
C++ draft standard部分13.3.3.1.5列表中有所介绍 – 示例中的初始化序列第2段:
void f(std::initializer_list<int>); f( {1,2,3} ); // OK: f(initializer_list<int>) identity conversion f( {’a’,’b’} ); // OK: f(initializer_list<int>) integral promotion f( {1.0} ); // error: narrowing
我们有一个完全匹配的身份转换.
对于参考重载,我们在第5段中说(强调我的未来):
Otherwise,if the parameter is a reference,see 13.3.3.1.4. [ Note: The rules in this section will apply for initializing the underlying temporary for the reference. —end note ]
表示临时创建,然后我们可以将规则应用于结果临时.这将是用户定义的转换,它比完全匹配更糟糕.
所以这不应该含糊不清.
更新
看起来有两个与此相关的活动错误:
> Compiler confused about whether to use a initializer_list assignment operator
> VC++ 12 RC fails to choose between initializer_list enabled assignment operator and canonical one for std::pair list elements