【问题标题】:Array and Rvalue数组和右值
【发布时间】:2010-09-07 07:49:35
【问题描述】:

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

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

【问题讨论】:

标签: c++ arrays lvalue rvalue lvalue-to-rvalue


【解决方案1】:

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

template<typename T> using alias = T;

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

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

【讨论】:

  • 更具体地说,在当前的措辞中,f().array 是一个 xvalue 不是吗?我认为不可能得到的是数组prvalue,不是吗?
  • @Peregring-lk 是的,它现在是一个 xvalue(不是在回答时)。在alias&lt;int[]&gt;{1, 2, 3} 中,表达式既是xvalue 又是prvalue。首先,它是一个没有关联对象的纯右值,当您对它进行索引时,“物化转换”会为其创建一个对象并给出表达式值类别“xvalue”,然后再获取指向数组第一个元素的指针。
【解决方案2】:

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

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

[1] 中的表达式arrayint (&amp;)[10] 类型的左值,它被转换为int *p 类型的右值,即N==10 T==int 的右值数组 被转换为 pointer to T==int 类型的左值。

【讨论】:

  • 你能给我举个例子,上面的引用适用于数组类型的右值吗?
  • 这就是函数不能返回数组类型的原因吗?
  • @Cedric H.:在 §8.3.5[dcl.fct]/3 中,标准规定 在确定每个参数的类型后,任何类型为“T 数组”或“函数返回 T”分别调整为“指向 T 的指针”或“指向返回 T 的函数的指针”。 即标准规定 void foo( char [10] ) 是完全等价于 void foo( char\* ) 的声明 --那是为了争论。然后在第 8.3.5/6 节中说:函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针或对此类事物的引用的返回类型。返回类型
  • 我对此投了反对票,因为它是错误的。你可以有数组类型的右值。
  • @David Rodríguez - dribeas 这里:"12" - 左值字符串,{'1', '2', '\0'} - 右值字符数组。 godbolt.org/z/lIcRbX 似乎 MSVC2017 即使在 15.9.6 中也无法正确编译,但旧的 gcc/clang - 可以!
【解决方案3】:

这是否有机会展示 Array Rvalue?

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

 int (*p)[10] = buf;

 int (*p2)[10] = p;      // LValue to Rvalue conversion of Array type 'p'
}

【讨论】:

    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多