加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 空inizializer_list上的赋值运算符

发布时间:2020-12-16 05:06:37 所属栏目:百科 来源:网络整理
导读:你能解释一下STL容器如何使用空的初始化列表处理赋值运算符? 当我做这样的事情: vectorint v;v = { }; 被调用的函数不是: vector operator= (initializer_listvalue_type il); 但: vector operator= (vector x); 另一方面,当我和我自己的班级做类似的事
你能解释一下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段中说(强调我的未来):

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读