在下面的C ++代码中,为什么与赋值运算符一起使用的结构初始化程序不会生成编译器错误?
是编译器错误吗?
它将在每个编译器上正常工作吗?
实际上是哪种作业?
class vector2D
{
public :
double x,y;
};
int main()
{
vector2D v1;
v1 = {1,2} ; // why does this compile and work?
}
赋值的右侧可以是braced-init-list:将其转换为要分配的某种适当类型的值(通常是左侧类型)。可以进行转换的只是aggregate初始化,就像C永远以某种形式存在(以及最近的compoundliteral)。
[当类没有显式定义的赋值运算符时,存在一个隐式定义的赋值运算符。
在您的情况下,有一个隐式定义的形式的副本分配运算符
vector2D& operator=(vector2D const& rhs);
您可以在此类赋值的右侧使用任何表达式,只要可以将其转换为vector2D const&
。在您的情况下,{1, 2}
确实满足该要求。因此,
v1 = {1,2};
可以。就像您曾经使用过:
v1 = vector2D{1,2};
是编译器错误吗?
没有
它将在每个编译器上正常工作吗?
它将在所有符合C ++ 11(或更高版本)的编译器上进行编译。
实际上是哪种作业?
它是使用列表初始化创建的临时对象的赋值。