12

$4.2/1 - ““N T 数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的右值。结果是指向数组第一个元素的指针。”

除了在初始化/声明期间,我不确定我们如何获得数组类型的右值?

4

3 回答 3

18

在这种情况下,我不确定您所说的“初始化/声明”指的是什么。下面的数组是prvalue

template<typename T> using alias = T;

int main() { return alias<int[]>{1, 2, 3}[0]; }

这可以通过decltype(alias<int[]>{1, 2, 3})type来验证int[3]。以这种方式动态创建数组最初并不是为了工作,而是通过有关统一初始化的相关工作滑入了工作草案。当我意识到 C++0x 工作草案中的某些段落不允许这种动态创建临时数组的某些特殊情况而其他段落允许它时,我向 C++ 委员会发送了一份缺​​陷报告,然后根据GCC 的部分工作实施决定完全支持这一点。

于 2012-02-04T10:17:56.010 回答
0

您无法获得数组类型的右值。数组只能是左值,并且无论何时在左值中使用它们时,它们都会衰减为指向第一个元素的指针。

int array[10];
int * p = array; // [1]

[1] 中的表达式array是类型的左值,int (&)[10]它被转换为类型的右值,即N==10 T==intint *p的右值数组被转换为指向 T==int 的指针类型的左值。

于 2010-09-07T07:53:11.460 回答
-2

这是否有机会展示 Array Rvalue?

int main(){
 int buf[10][10];

 int (*p)[10] = buf;

 int (*p2)[10] = p;      // LValue to Rvalue conversion of Array type 'p'
}
于 2010-09-07T08:04:04.007 回答