使用括号括起来的初始化器分配字符串时出错

问题描述

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