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

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...