$4.2/1 - “类型的左值或右值 “N T 数组”或“未知数组” T”的界限可以转换为 “指向 T 的指针”类型的右值。这 结果是指向第一个的指针 数组的元素。”
我不确定除了初始化/声明期间我们如何获得数组类型的右值?
我不确定您在这种情况下所说的“初始化/声明”指的是什么。在下文中,数组是纯右值
template<typename T> using alias = T;
int main() { return alias<int[]>{1, 2, 3}[0]; }
这可以通过具有类型
decltype(alias<int[]>{1, 2, 3})
的int[3]
来验证。以这种方式即时创建数组最初并不是为了工作,而是通过统一初始化的相关工作滑入了工作草案。当我意识到 C++0x 工作草案中的某些段落不允许这种动态创建临时数组的某些特殊情况而其他段落允许时,我向 C++ 委员会发送了一份缺陷报告,然后基于GCC 的部分工作实施决定全力支持这一点。
你不能得到数组类型的右值。数组只能是左值,每当它们在左值中使用时,它们都会衰减为指向第一个元素的指针。
int array[10];
int * p = array; // [1]
[1]中的表达式
array
是int (&)[10]
类型的左值,它被转换为int *p
类型的右值,即N==10 T==int的右值数组被转换为指向 T==int. 类型的左值
获取数组正确的引用值非常容易,因为类引用属性将被添加到它的成员中。
struct s {
int arr[5];
};
using array_right_reference = decltype((s().arr));
static_assert(std::is_same<array_right_reference, int (&&)[5]>::value, "");
这有机会展示数组右值吗?
int main(){
int buf[10][10];
int (*p)[10] = buf;
int (*p2)[10] = p; // LValue to Rvalue conversion of Array type 'p'
}