$4.2/1 -“array of N T”或“array of unknown bound of T“类型的左值或右值可以转换为“pointer to T”类型的右值。结果是指向数组第一个元素的指针。”我不确定除了在初始化/声明期间之外,我们如何获得数组类型的右值?
hl0ma9xz1#
我不确定你在这个上下文中所说的“初始化/声明”指的是什么
template<typename T> using alias = T; int main() { return alias<int[]>{1, 2, 3}[0]; }
这可以通过decltype(alias<int[]>{1, 2, 3})的类型int[3]来验证。以这种方式动态创建数组最初并不打算工作,但通过统一初始化的相关工作进入了工作草案。当我意识到C0x工作草案中的某些段落不允许这种动态创建数组临时变量的某些特殊情况,而其他段落允许时,我向C委员会提交了一份缺陷报告,然后在GCC部分工作实现的基础上决定完全支持这一点。
decltype(alias<int[]>{1, 2, 3})
int[3]
wsxa1bj12#
你不能得到数组类型的右值。数组只能是左值,并且每当它们被用在左值中时,它们都会衰减为指向第一个元素的指针。
int array[10]; int * p = array; // [1]
[1]中的表达式array是一个int (&)[10]类型的左值,它被转换为int *p类型的右值,也就是说,N==10 T==int* 的右值 * 数组被转换为指向T==int* 的 * 类型的左值。
array
int (&)[10]
int *p
lx0bsm1f3#
很容易得到数组的正确引用值,对于一个类引用属性会被添加到它的成员中。
struct s { int arr[5]; }; using array_right_reference = decltype((s().arr)); static_assert(std::is_same<array_right_reference, int (&&)[5]>::value, "");
w41d8nur4#
这是否有机会展示数组R值?
int main(){ int buf[10][10]; int (*p)[10] = buf; int (*p2)[10] = p; // LValue to Rvalue conversion of Array type 'p' }
4条答案
按热度按时间hl0ma9xz1#
我不确定你在这个上下文中所说的“初始化/声明”指的是什么
这可以通过
decltype(alias<int[]>{1, 2, 3})
的类型int[3]
来验证。以这种方式动态创建数组最初并不打算工作,但通过统一初始化的相关工作进入了工作草案。当我意识到C0x工作草案中的某些段落不允许这种动态创建数组临时变量的某些特殊情况,而其他段落允许时,我向C委员会提交了一份缺陷报告,然后在GCC部分工作实现的基础上决定完全支持这一点。wsxa1bj12#
你不能得到数组类型的右值。数组只能是左值,并且每当它们被用在左值中时,它们都会衰减为指向第一个元素的指针。
[1]中的表达式
array
是一个int (&)[10]
类型的左值,它被转换为int *p
类型的右值,也就是说,N==10 T==int* 的右值 * 数组被转换为指向T==int* 的 * 类型的左值。lx0bsm1f3#
很容易得到数组的正确引用值,对于一个类引用属性会被添加到它的成员中。
w41d8nur4#
这是否有机会展示数组R值?