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