C++ 03§4.2N°1:
左值或类型的右值“阵列NT的”或“的阵列T的未知边界“可以转换为类型为”指向T的指针“的右值。结果是指向数组的第一个元素的指针。我想可能想出了阵列型的右值的一个例子
很长时间以来,我一直在困惑的是,我并不完全理解数组类型的右值意味着什么。也就是说,我无法想出一个表达式,其类型是一个数组,结果是一个右值。我读this线程,它基本上提出相同的问题,并且接受的答案是“不,数组类型不存在右值”。我想我可能会对此产生矛盾。
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,因为当他们谈论函数到指针的转换时,他们只提到了函数类型的左值(显然理解这里没有右值)。所以他们很可能会想到数组类型的右值。
所以,基本上我的问题是我是否没有拿出数组类型的右值的一个例子,如果没有,请提供一个有效的,我相信stongly存在。
谢谢!所以你知道这是否是右值数组的唯一情况,这是由。或 - >。还有其他的例子吗? – 2010-10-30 10:23:21
@Armen我想不出另一种情况(对于C++ 03)。 – 2010-10-30 10:27:16
@Armen注意到,因此,即使将数组声明为const const a [4];',Comeau也表示'A()。a'的类型为int [4]'。这是因为该标准表示非类类型的rvalues从来没有cv限定,并且因为EDG前端对数组及其元素类型进行cv限定为双向等效(请参阅核心问题#1059)。 – 2010-10-30 10:32:31