为什么这不起作用?(引用的大括号初始化)

Why doesn't this work? (brace-initialization of references)

本文关键字:初始化 引用 不起作用 为什么      更新时间:2023-10-16
#include <array>
int main()
{
    struct A
    {
        unsigned char l;
        std::array<char, 12> c;
    };
    const A a = {1, "t"}; // OK
    const A& ar = {1, "t"}; // error: invalid initialization of reference of type 'const main()::A&' from expression of type '<brace-enclosed initializer list>'
}

(GCC 8.2, -std=C++17)

这个问题谈到了一个 GCC 错误,但它是旧的(7 年前)。

请注意,我不关心寿命延长,我实际上是将临时直接传递给函数以供使用而不是存储它,但我尝试使示例干净。


编辑:

  • 我不能使示例变小。特别是,它与 array<char> .
  • 在"t"周围添加更多大括号,但仍然失败。
  • 有效的方法是将字符串文本分解为字符:

    const A& ar = {1, {'a', 'b'}}; // works
    
首先

要注意的是,初始值设定项{1, "t"}使用大括号省略来初始化子聚合A.c这意味着文本"t"用于直接初始化std::array持有的内部数组。在这种情况下,此数组看起来像 char data[12] .

这简化为我们正在初始化对const A的引用,其中包含一个包含初始化成员数组的元素的大括号列表

这在某种程度上等同于:

struct S {
    char const data[2];
};
S const& s = {"t"}; // fail for gcc

GCC已经对此进行了错误报告。

您已经在注释部分中提供了解决方法。只需将引用初始化为:

const A& ar = A{1, "t"}