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

hae*_*lix 6 c++ reference list-initialization

#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>'
}
Run Code Online (Sandbox Code Playgroud)

(gcc 8.2,-std = c ++ 17)

这个问题谈到了一个海湾合作委员会的错误,但它已经过时了(7年前).

请注意,我不关心生命周期扩展,我实际上是将临时文件直接传递给函数而不是存储它,但我尝试将示例清理干净.


编辑:

  • 我不能让这个例子变小.特别是,它与...有关array<char>.
  • 在"t"周围添加更多大括号但仍然失败.
  • 有效的东西是将字符串文字扩展为字符:

    const A& ar = {1, {'a', 'b'}}; // works
    
    Run Code Online (Sandbox Code Playgroud)

Jan*_*ans 3

首先要注意的是,初始化程序{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
Run Code Online (Sandbox Code Playgroud)

GCC 已经对此有一个错误报告。

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

const A& ar = A{1, "t"}
Run Code Online (Sandbox Code Playgroud)