在下面的C++代码中,为什么与赋值运算符一起使用的结构初始化器不会生成编译器错误?
这是一个编译器错误吗?
它能在每个编译器上工作吗?
这到底是什么类型的任务?
class vector2D
{
public :
double x,y;
};
int main()
{
vector2D v1;
v1 = {1,2} ; // why does this compile and work?
}
发布于 2020-02-01 05:31:03
它是一个编译器错误吗?
不是的。
它能在每个编译器上工作吗?
它可以在所有兼容C++11 (或更高版本)的编译器上编译。
这到底是什么类型的任务?
它是从使用列表初始化创建的临时对象中赋值的。
发布于 2020-02-01 04:53:25
赋值的右侧可以是带括号的init列表:它被转换为要赋值的某种适当类型的值(通常是左侧类型)。它可以如此转换只是聚合初始化,就像C语言永远以某种形式(以及最近的复合字面量)一样。
发布于 2020-02-01 05:28:08
如果类没有显式定义的赋值运算符,则存在隐式定义的赋值运算符。
在您的示例中,有一个隐式定义的复制赋值运算符,其形式为
vector2D& operator=(vector2D const& rhs);
您可以在这种赋值的右侧使用任何表达式,只要它可以转换为vector2D const&
。在您的例子中,{1, 2}
确实满足了这一要求。出于这个原因,
v1 = {1,2};
没问题。就好像你用过:
v1 = vector2D{1,2};
https://stackoverflow.com/questions/60014059
复制