数组prvalue的地址

时间:2019-02-14 17:51:32

标签: c++ arrays temporary-objects

我不明白为什么这行不通:

auto a = (int[]){1, 2, 3, 4, 5};

> error: taking address of temporary array

我知道数组左值在转换为右值时会衰减到指针,但是这里数组已经是右值(实际上是prvalue),因此不需要衰减。我希望可以推导出a并将其初始化为int[5]。为什么要尝试获取临时地址?

1 个答案:

答案 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};