为具有数组数据成员的结构分配聚合初始化时出错

问题描述 投票:0回答:1

下面这段代码在 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 中,或者更确切地说是与聚合初始化相关的一些标准缺陷 是后来才解决的吗?或者什么?

c++ gcc c++17
1个回答
1
投票

这是一个 GCC 错误,归档为 带有字符串文字初始值设定项的成员字符数组导致 = {} 失败

已针对 GCC 11 进行修复。

© www.soinside.com 2019 - 2024. All rights reserved.