为什么这不起作用?(引用的大括号初始化)
Why doesn't this work? (brace-initialization of references)
#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"}
相关文章:
- C++在构造函数处用表达式初始化引用
- 我可以从取消引用"new"的返回值初始化引用吗
- 通过用户定义的转换初始化引用
- 为什么我可以在初始化引用后重新绑定引用?
- TBB 编译器错误 -"my_task":必须初始化引用
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为构造函数初始化引用实例变量提供默认值
- 在构造过程中获取类成员的未初始化引用是否合法
- 在C++中初始化引用
- 在动态分配的结构中初始化引用
- 使用三元运算符初始化引用变量
- 如何在 c++ 中显式初始化引用
- 初始化引用时何时以及为何获得副本
- 初始化C++引用-为什么不使用运算符的地址
- 在C++中初始化引用和变量
- 在函数参数中分配/初始化引用
- 在 C++ 中初始化引用不起作用,但初始化 const 引用有效,为什么?
- 类组合构造函数 d 必须显式初始化引用成员
- 用对tuple的引用初始化引用的元组
- 为什么在c++中不能重新初始化引用