关于左值到右值的转换

“在一元&运算符的操作数上没有进行左值到右值的转换。” 我可以知道这意味着什么>任何人都可以解释..请 例如:
 int a[]={1,5};
 int* x=&a; 
    
已邀请:
嗯,这意味着左值转换的左值不是 :-)完成。当您需要时,会发生左值转换的左值 对象的值,而不仅仅是对它的引用。 获取对象的地址不需要该值,因此 右值转换没有左值。 我不确定这与你的代码有什么关系。转换 在你的代码的第二行没有完成的是 数组到指针的转换。左值转换的左值 当然,还没有完成,但那是相当直观的 和正常的。数组到指针的转换发生在大多数用途中 但是,表达式中的数组可能会令人惊讶 有些人更多。 (实际上,数组到指针转换 仅在必要时发生。但是非常非常少 在阵列上合法的操作,所以它经常发生 必要的。)在一元和一的情况下。运算符,数组到 指针转换不会发生(并且不能,因为 数组到指针转换的结果是一个rvalue,和 一元&需要一个左值。所以你拿的是地址 数组,类型为int()[2],即指向数组的指针 两个int。这反过来使得任务非法,因为 目标类型不是int()[2],而是int *,并且没有 两者之间的隐式转换。     
在表达式中,左值转换的左值是指查看对象的值,并在需要对象值的地方使用(例如,在
a + b
中,您需要
a
b
的值来确定您不需要知道的结果where - 如果在任何地方 - 原始对象来自)。 在address-of运算符中你需要拥有对象本身(即左值),对象的值是无关紧要的,因此左值转换的左值无益,它将失去对象本身的身份(位置),这是拿一个地址很重要。     
int a[] = {1, 5};
int* x = &a;
这是一个类型错误。
&
运算符产生指向其操作数的指针。它的操作数在这里是什么?一个2个整数的数组。指向2个整数数组的指针不是类型
int*
,而是类型
int(*)[2]
。 请注意您引用的规则如何适用于此:在许多上下文中,数组的名称衰减为指向其第一个元素的指针。 (但一般来说,数组和指针都不一样!)当你说
int* x = a;
时会发生这种情况。但是,当您将
&
运算符应用于数组时,这种衰减不会发生。 (如果转换确实发生了,
&a
会尝试取
a
的地址,这是无稽之谈。)     

要回复问题请先登录注册