[英]regarding lvalue-to-rvalue conversion
“不对一元&运算符的操作数进行左值到右值转换。”
我可以知道这对什么意味着什么>。任何人都可以解释..请
例如:
int a[]={1,5};
int* x=&a;
好吧,这意味着未完成从左值到右值的转换:-)。 从左值到右值的转换是在您需要对象的值而不仅仅是对它的引用时发生的。 获取对象的地址不需要该值,因此不存在左值到右值的转换。
我不确定这与您的代码有何关系。 代码第二行中未完成的转换是数组到指针的转换。 从左值到右值的转换当然也没有完成,但这是相当直观和正常的。 数组到指针的转换发生在表达式中数组的大多数使用中,因此可能会使某些人感到惊讶。 (实际上,数组到指针的转换仅在必要时发生。但是,在数组上合法的操作非常少,因此非常有必要。)对于一元&运算符,数组到指针的转换不会不会发生(并且不会,因为数组到指针的转换结果是一个右值,而一元&则需要一个左值)。 因此,您将获取类型为int( )[2]的数组的地址,即指向两个int数组的指针。 这又使分配非法,因为目标类型不是int( )[2],而是int *,并且两者之间没有隐式转换。
在表达式中, 从左值到右值的转换是指查看对象的值,并在需要对象值的地方使用(例如,在a + b
,需要a
和b
的值来确定不需要的结果)知道原始对象来自哪里(如果有的话)。
在address-of运算符中,您需要具有对象本身(即lvalue ),该对象的值无关紧要,因此从左值到右值的转换将无济于事,它将丢失对象本身的身份(位置),即什么对讲话很重要。
int a[] = {1, 5}; int* x = &a;
那是类型错误。 &
运算符产生一个指向其操作数的指针。 它的操作数是什么? 2个整数的数组。 指向 2个整数的数组的指针不是int*
类型,而是int(*)[2]
。
请注意您引用的规则在这里如何应用:在许多情况下,数组的名称会衰减为指向其第一个元素的指针。 (但是通常, 数组和指针是不一样的 !)当您说int* x = a;
时,就会发生这种情况int* x = a;
。 但是,将&
运算符应用于数组时, 不会发生这种衰减。 (如果转换发生过的事, &a
将尝试采取的地址的地址a
,这是无稽之谈。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.