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

Arm*_*yan 11 c++ arrays rvalue lvalue-to-rvalue

C++03§4.2N°1:
类型为"NT的数组"或"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...
}
Run Code Online (Sandbox Code Playgroud)

我在这里看到两个选项:
选项1:我是正确的,欢呼,是的,很酷.在这种情况下,问题是:还有其他例子吗?
选项2:我不对,在这种情况下问题是:这是标准的缺陷吗?

我不知道1,但我真的怀疑2,因为当他们谈论函数到指针的转换时,他们只提到了函数类型的左值(很明显没有这样的rvalues).所以他们很可能已经考虑了数组类型的rvalues.

所以,基本上我的问题是我是否提出了数组类型右值的例子,如果没有,请提供一个有效的,我坚信它存在.

Joh*_*itb 11

是的,你是对的.表达式是数组类型的右值.这不是缺陷 - 委员会知道它,它也是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(); }
Run Code Online (Sandbox Code Playgroud)