c – 空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 如果列表不为空,它工作正常,它只是用初始化列表调用函数.只有当列表为空时才会出现问题,在向量上调用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段中说(强调我的未来):
表示临时创建,然后我们可以将规则应用于结果临时.这将是用户定义的转换,它比完全匹配更糟糕. 所以这不应该含糊不清. 更新 看起来有两个与此相关的活动错误: > Compiler confused about whether to use a initializer_list assignment operator (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |