【发布时间】:2014-01-14 18:07:53
【问题描述】:
你能解释一下 STL 容器如何处理带有空初始化列表的赋值运算符吗?
什么时候我会做这样的事情:
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
如果列表不为空,它工作正常,它只是调用带有初始化列表的函数。只有当列表为空时才会出现问题,在向量上它调用右值赋值运算符,在我的类上它给出错误。
这种情况在vector和其他容器中是如何处理的?
【问题讨论】:
-
gcc和clang都没有相同的错误,但与 vs 确认错误。 -
g++ 和 clang++ 明确选择
initializer_List<int>重载operator=。我认为这是正确的:根据[over.ics.list],这个重载的转换等级应该是Exact Match。对于引用重载,必须创建一个临时对象,因此引用(可能)不会直接绑定;因此转换序列是用户定义的转换。 (请注意定义 this 的 [over.ics.ref] 部分没有提及 list-init;它可能未指定。) -
@dyp 这就是我的想法
-
@dyp 所以引用绑定指回
8.5.3,它列举了不包括initializer_list的直接绑定情况,所以我们回退到8.5,这将把我们带到8.5.4for list-initializaton 所以我认为它没有被指定,也许是令人费解的。
标签: c++ visual-studio-2013 initializer-list overload-resolution compiler-bug