下面这段代码在 gcc 8.5 到 10.5 上失败,并出现
g++ -std=c++17
(https://godbolt.org/z/od99f93Tx):
struct T { char arr[2]; };
int main()
{
T data;
data = { "V" };
return 0;
}
错误是:
source>: In function 'int main()':
<source>:6:18: error: no match for 'operator=' (operand types are 'T' and '<brace-enclosed initializer list>')
data = { "V" };
^
<source>:1:8: note: candidate: constexpr T& T::operator=(const T&)
struct T { char arr[2]; };
^
<source>:1:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const T&'
<source>:1:8: note: candidate: constexpr T& T::operator=(T&&)
<source>:1:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'T&&'
Compiler returned: 1
但它可以在 gcc 11.1 中使用相同的
-std=c++17
标志。如果您将数组成员更改为其他非数组类型(例如 int 或其他类型),并用一些兼容的值替换 "V"
当然,它适用于从 8.5 到 11 的所有版本。这是一个已修复的 gcc bug在 gcc 11 中,或者更确切地说是与聚合初始化相关的一些标准缺陷
是后来才解决的吗?或者什么?
这是一个 GCC 错误,归档为 带有字符串文字初始值设定项的成员字符数组导致 = {} 失败。
已针对 GCC 11 进行修复。