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

标签 c++ c-strings assignment-operator initializer

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

关于c++ - 使用括号括起来的初始化器分配字符串时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64375816/

相关文章:

C++ 赋值运算符异常安全

c++ - 什么是 (x & 1) 和 (x >>= 1)?

c++ - 处理赋值运算符重载;你能重新分配一个引用吗?

c++ - 从文件中读取视频时 opencv 出现段错误

arrays - 适当的长度传递给 fgets

c - 字符串中的 `% a` 读取为内存中的一个点

c++ - 将 std::u8string 复制到 utf8 字符的 c 风格字符串中

c++ - 在赋值运算符之前调用结构的析构函数

c++ - Qt 没有链接到 sql

c++ - 将 ListView 控件滚动到特定项目