以下代码片段在 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 错误吗?该错误已在 gcc 11 中修复,还是与聚合初始化相关的某些标准缺陷直到后来才得到解决?还是什么?
这是一个 GCC 错误,归因于成员 char 数组与字符串文字初始化器导致 = {} 失败。
它似乎源于 C++14 中的变化。
该问题已针对 GCC 11 进行了修复。