问题描述
struct A{
char s[10];
};
int main()
{
A a1;
a1 = {"abc"};
return 0;
}
在GCC中出现以下错误:
In function 'int main()':
8:8: error: no match for 'operator=' (operand types are 'A' and '<brace-enclosed initializer list>')
8:8: note: candidates are:
1:8: note: A& A::operator=(const A&)
1:8: note: no kNown conversion for argument 1 from '<brace-enclosed initializer list>' to 'const A&'
1:8: note: A& A::operator=(A&&)
1:8: note: no kNown conversion for argument 1 from '<brace-enclosed initializer list>' to 'A&&'
但是在Visual Studio中工作正常(即使没有警告)。所以只是想知道它是编译器特定的吗? C ++标准对此有何规定?对我来说,海湾合作委员会的行为看来是正确的。但是有人可以解释一下这背后的基本原理吗?
注意:如果我初始化为A a1={"abc"}
,那么它在GCC中可以正常工作。那么为什么赋值操作不起作用?
编辑:a1 = {'a','b','c'}与a1 = {“ abc”}之间有什么区别。前者在海湾合作委员会工作。
解决方法
此声明:
a = {"abc"}; // error
格式错误,错误消息清楚地说明了原因。该语句试图执行赋值,但是赋值的左侧是A
,而右侧是大括号初始化列表。没有A::operator=
带有大括号初始化列表,因此分配不起作用。
另一方面,此语句:
A a = {"abc"}; // ok
是构造类型为A
的对象,该对象考虑A
的所有构造方法。由于A
是聚合类型,因此存在一个可以接受可用于初始化s
的单个参数的构造函数。
这意味着,如果要分配给现有对象,可以创建一个A
对象,然后然后分配它:
a = A{"abc"}; // ok