空的inizalizer_list上的赋值运算符
assignment operator on empty inizializer_list
您能解释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和其他容器中处理这种情况?
这似乎是一个bug clang(实时查看)和gcc(实时查看)接受此程序并选择std::initializer_list重载,该重载看起来是正确的,因为这是完全匹配,这在C++草案标准部分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段,它说(强调我的未来):
否则,如果参数是参考,请参见13.3.3.1.4。[注意:本节中的规则将适用于初始化引用的基础临时。--结束注释]
表示创建了临时,然后我们可以将规则应用于生成的临时。这将是用户定义的转换,比完全匹配更糟糕。
所以这不应该是模棱两可的。
更新
看起来有两个活跃的错误与此相关:
- 编译器对是否使用initializer_list赋值运算符感到困惑
- VC++12 RC无法在initializer_list启用的赋值运算符和std::pair列表元素的规范运算符之间进行选择
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- C++ 通过自定义赋值运算符隐式转换函数参数
- 赋值运算符的奇怪行为
- C++赋值运算符,我们可以用 copy 替换它吗?