【发布时间】:2010-09-07 07:49:35
【问题描述】:
$4.2/1 - “类型的左值或右值 “N T 数组”或“未知数组” T”的边界可以转换为 “指向 T 的指针”类型的右值。这 结果是指向第一个的指针 数组的元素。”
我不确定除了在初始化/声明期间如何获取数组类型的右值吗?
【问题讨论】:
标签: c++ arrays lvalue rvalue lvalue-to-rvalue
$4.2/1 - “类型的左值或右值 “N T 数组”或“未知数组” T”的边界可以转换为 “指向 T 的指针”类型的右值。这 结果是指向第一个的指针 数组的元素。”
我不确定除了在初始化/声明期间如何获取数组类型的右值吗?
【问题讨论】:
标签: c++ arrays lvalue rvalue lvalue-to-rvalue
我不确定您在这种情况下所说的“初始化/声明”指的是什么。下面的数组是prvalue
template<typename T> using alias = T;
int main() { return alias<int[]>{1, 2, 3}[0]; }
这可以通过具有int[3] 类型的decltype(alias<int[]>{1, 2, 3}) 来验证。以这种方式动态创建数组最初并不是为了工作,而是通过有关统一初始化的相关工作滑入了工作草案。当我意识到 C++0x 工作草案中的某些段落不允许这种动态创建临时数组的一些特殊情况而其他段落允许它时,我向 C++ 委员会发送了一份缺陷报告,然后根据GCC 部分工作的实施决定完全支持这一点。
【讨论】:
f().array 是一个 xvalue 不是吗?我认为不可能得到的是数组prvalue,不是吗?
alias<int[]>{1, 2, 3} 中,表达式既是xvalue 又是prvalue。首先,它是一个没有关联对象的纯右值,当您对它进行索引时,“物化转换”会为其创建一个对象并给出表达式值类别“xvalue”,然后再获取指向数组第一个元素的指针。
您无法获得数组类型的右值。数组只能是左值,并且无论何时在左值中使用它们都会衰减为指向第一个元素的指针。
int array[10];
int * p = array; // [1]
[1] 中的表达式array 是int (&)[10] 类型的左值,它被转换为int *p 类型的右值,即N==10 T==int 的右值数组 被转换为 pointer to T==int 类型的左值。
【讨论】:
void foo( char [10] ) 是完全等价于 void foo( char\* ) 的声明 --那是为了争论。然后在第 8.3.5/6 节中说:函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针或对此类事物的引用的返回类型。返回类型
"12" - 左值字符串,{'1', '2', '\0'} - 右值字符数组。 godbolt.org/z/lIcRbX 似乎 MSVC2017 即使在 15.9.6 中也无法正确编译,但旧的 gcc/clang - 可以!
这是否有机会展示 Array Rvalue?
int main(){
int buf[10][10];
int (*p)[10] = buf;
int (*p2)[10] = p; // LValue to Rvalue conversion of Array type 'p'
}
【讨论】: