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