我想我可能想出了一个rvalue数组类型的例子

C ++03§4.2N°1: 可以将“N T数组”或“T的未知数组的数组”类型的左值或右值转换为“指向T的指针”的右值。结果是指向数组的第一个元素的指针。 很长一段时间以来我在这个陈述中令人困惑的是,我不太明白阵列类型的右值是什么意思。也就是说,我无法想出一个表达式,其类型是一个数组,结果是一个右值。我读了这个帖子,基本上问了同样的问题,接受的答案是“不,没有数组类型的右值”。我想我可能与此矛盾。 C ++03§5.2.5N°4 :(关于表达式E1.E2) 如果E2是非静态数据成员,并且E1的类型是“cq1 vq1 X”,并且E2的类型是“cq2 vq2 T”,则表达式指定由第一表达式指定的对象的命名成员。如果E1是左值,则E1.E2是左值。 我认为否则它是一个右值(假设E2不是参考,那个案例被
§5.2.5 N°3
覆盖),因此......
struct A
{
   int a[4];
};
A f()
{
   A a;
   return a; 
}
int main()
{
   f().a; //I think this is an rvalue of array type...
}
我在这里看到两个选项: 选项1:我是正确的,欢呼,喜欢,很酷。在这种情况下,问题是:还有其他例子吗? 选项2:我不对,在这种情况下问题是:这是标准的缺陷吗? 我不知道1,但我真的怀疑2,因为当他们谈论函数到指针的转换时,他们只提到了函数类型的左值(很明显没有这样的rvalues)。所以他们很可能已经考虑了数组类型的rvalues。 所以,基本上我的问题是我是否提出了数组类型右值的例子,如果没有,请提供一个有效的,我坚信它存在。     
已邀请:
是的,你是对的。表达式是数组类型的右值。这不是缺陷 - 委员会知道它,它也是C89中的一个常见问题,它只允许转换为数组类型左值的指针。因此,您无法索引或取消引用像
f().a
这样的数组。 C99解决了这个问题,而C ++没有问题。 注意,它是否是rvalue与表达式是否表示对象无关。 C ++ 03意外省略,表示数组类型的右值表达式表示一个对象。这是由DR#450在C ++ 0x中修复的。   (显然很欣赏没有这样的rvalues) 实际上有函数类型的rvalues。对于由类成员访问表达式表示的非静态成员函数,会出现这些问题
struct A { void f(); };

/* A().f is an rvalue of type "void()" */
int main() { A().f(); }
    
A是一个右值。里面的数组不是。想象一下,在该临时对象上有一个方法链的情况 - 其中的变量存在多个方法调用和返回,并且它们可以将引用(在链的持续时间内有效)传递给其他函数。这些功能不能事先知道它们应被称为右值。 在最新版本的草稿中,您可以在rvalue / lvalue * this上重载函数。然而,即使这样,rvalue引用也不会产生所谓的rvalue的内容,而且我不完全确定任何编译器当前支持这个,并且我知道MSVC没有。 事实上,使用decltype,您可以轻松确定编译器将该数组称为左值。 考虑:
template<typename A, typename B> auto sum(A&& a, B&& b) -> decltype(std::forward<A>(a) + std::forward<B>(b)) {
    return std::forward<A>(a) + std::forward<B>(b);
}
这就是decltype的用途,它绝对区分了左值和右值。或者,考虑一下:
int main()
{
    auto var = f().a;
}
Var是一个int *。这是一个瞬间失败,因为f()。a立即死亡。不确定我对此的直接看法,但它肯定对rvalue无效。     

要回复问题请先登录注册