gpt4 book ai didi

c++ - 空 initializer_list 上的赋值运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:45 32 4
gpt4 key购买 nike

您能解释一下 STL 容器如何处理初始化列表为空的赋值运算符吗?

当我做这样的事情时:

vector<int> v;
v = { };

调用的函数不是:

vector& operator= (initializer_list<value_type> il);

但是:

vector& operator= (vector&& x);

另一方面,当我对自己的类(class)做类似的事情时:

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 上它调用右值赋值运算符,在我的类上它给出错误。

vector 和其他容器如何处理这种情况?

最佳答案

这似乎是一个错误 clang( see it live ) 和 gcc( see it live ) 接受这个程序并选择 std::initializer_list 重载,它看起来是正确的,因为它是一个完全匹配,这在 C++ draft standard 中有介绍section section 13.3.3.1.5 List-initialization sequence 段落 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 段,它说(emphasis mine going forward):

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 ]

表示创建了临时文件,然后我们可以将规则应用于生成的临时文件。这将是一个用户定义的转换,比完全匹配差。

所以这不应该是模棱两可的。

更新

看起来有两个与此相关的活跃错误:

关于c++ - 空 initializer_list 上的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120788/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com