我不明白为什么这行不通:
auto a = (int[]){1, 2, 3, 4, 5};
> error: taking address of temporary array
我知道数组左值在转换为右值时会衰减到指针,但是这里数组已经是右值(实际上是prvalue),因此不需要衰减。我希望可以推导出a
并将其初始化为int[5]
。为什么要尝试获取临时地址?
答案 0 :(得分:4)
我本来可以推论
a
并将其初始化为int[5]
可悲的是,这不是C数组的工作方式。数组衰减为指针。您不能真正拥有“数组值”。如果将auto替换为推断的类型,则看起来像这样:
int* a = (int[]){1, 2, 3, 4, 5};
衰减必须使用地址作为指针。
通过引用可以轻松解决此问题,因为对临时对象的引用会延长其寿命:
auto&& a = (int[]){1, 2, 3, 4, 5}; // works!
下面是在compiler explorer上运行的示例。
当然,通过std::array
,您将获得不错的语法和值语义:
auto a = std::array{1, 2, 3, 4, 5};