为什么这个指针在这种情况下被视为右值?

Why is this pointer treated as an rvalue in this scenario?

以下将不起作用:

std::array<int, 3> arr = {1, 2, 3};
int **ptr = &(arr.data());

因为我会尝试获取右值的地址。我已经解决了这个问题:

std::array<int, 3> arr = {1, 2, 3};
int *ptr = arr.data();
int **ptr2 = &ptr;

这似乎工作得很好。

我知道你不能取右值的地址,但为什么在这里这样对待它?是不是因为将从 arr.data() 创建一个临时文件,然后分配给 ptr 而我会尝试获取该临时文件的地址?

Is it because a temporary will be created from arr.data() and then assigned to ptr and I'd be trying to take the address of that temporary?

是的。任何 return 的值 return 都是右值。 std::array::data return T*,不是 T*&,所以它的 return 值是一个右值。

Why is this pointer treated as an rvalue in this scenario?

&(arr.data())

因为std::array::datareturns一个值。调用的结果是纯右值。纯右值是(“纯”)右值。