数组和右值

Chu*_*dad 9 c++ arrays rvalue lvalue lvalue-to-rvalue

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

我不知道如何在初始化/声明期间获得数组类型的rvalue?

Joh*_*itb 14

我不确定你在这种情况下通过"初始化/声明"引用了什么.在下文中,数组是prvalue

template<typename T> using alias = T;

int main() { return alias<int[]>{1, 2, 3}[0]; }
Run Code Online (Sandbox Code Playgroud)

这可以通过decltype(alias<int[]>{1, 2, 3})具有类型来验证int[3].以这种方式动态创建数组最初并不打算工作,而是通过统一初始化的相关工作进入工作草案.当我意识到C++ 0x工作草案中的某些段落不允许这种即时创建阵列临时工具的特殊情况而其他段落允许时,我向C++委员会发送了一份缺​​陷报告,然后在此基础上海湾合作委员会的部分工作实施决定全力支持这一点.

  • @Peregring-lk 是的,现在它是一个 xvalue(不是在回答时)。在 `alias&lt;int[]&gt;{1, 2, 3}` 中,表达式既是 xvalue 又是纯右值。首先,它是一个没有关联对象的纯右值,当您对其进行索引时,“具体化转换”会为其创建一个对象,并在获取指向数组第一个元素的指针之前给出表达式值类别“xvalue”。 (2认同)

Dav*_*eas 1

您无法获取数组类型的右值。数组只能是左值,每当它们在左值中使用时,它们就会衰减为指向第一个元素的指针。

int array[10];
int * p = array; // [1]
Run Code Online (Sandbox Code Playgroud)

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