gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:09:10 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com