C++ 当运算符的地址可以设置为普通变量时,为什么运算符的地址要求从函数返回地址?

C++ 当运算符的地址可以设置为普通变量时,为什么运算符的地址要求从函数返回地址?,c++,C++,这是我的小班: class test{ public: int& addressofx(); private: int x; }; int& test::addressofx(){ return x; } 主要内容如下: int main(){ test a; int& foo = a.addressofx(); } 为什么上面的编译很好,但是当我将函数addressofx转换成常规的int函数(不是int&)时,会出现错误

这是我的小班:

class test{
public:
    int& addressofx();
private:
    int x;
};

int& test::addressofx(){
    return x;
}
主要内容如下:

int main(){
    test a;
    int& foo = a.addressofx();
}
为什么上面的编译很好,但是当我将函数addressofx转换成常规的int函数(不是int&)时,会出现错误

您可以这样做:

int x;
int &y = x;

没有得到x的地址,但是当你从函数返回x时,你需要它的地址吗?为什么?

您没有返回任何东西的地址。你在退回一张支票

此代码将返回一个地址:

class test {
    public:
        int* addressofx();
    private:
        int x;
};

int* test::addressofx() {
    return &x;
}

int main() {
    test a;
    int* foo = a.addressofx();
}
int&addressofx()

这是将引用返回到
int
变量

int&foo=a.addressofx()

这是在声明一个非
常量
左值引用(左值表示它有一个分配给它的变量名,即它可以出现在表达式的左侧),该引用保存对int变量的引用。由于函数返回对int的引用,编译器很高兴

当我将函数addressofx转换成一个常规的int函数(不是int&)时,我会得到错误吗

常量
左值引用不能绑定到临时值(如果进行更改,
addressofx()
将返回什么)。这就是rvalue引用(在C++11中引入)被设计用来处理的内容,但是在本例中您没有使用该特性

您可以这样做:
int x
int&y=x

因为您正在声明一个左值引用并将其绑定到一个左值变量。这是允许的

如果更改
addressofx()
以返回
int
(这是一个rvalue,因为它没有名称,所以只能出现在表达式的右侧),则返回值不能绑定到非
const
lvalue引用,因为它不是实变量。但是,它可以绑定到一个
常量
左值引用(然后编译器会将临时函数的生存期延长到函数返回之后),例如:


简言之,您需要详细了解引用是如何工作的,以及左值右值之间的区别。不是所有的组合都可以一起使用。

首先需要了解C++中的引用。学习引用和操作符地址之间的区别,它们都使用符号<代码>和<代码>。还有按位AND运算符(也使用符号
&
)和逻辑AND运算符(不太严格)(使用符号
&
)。addressofx()不返回a.x吗?x是a的成员,在赋值过程中,它仍然存在于main()中,那么为什么它被认为是临时的?如果
addressofx()
返回
int&
,那么它返回
a.x
的内存地址。如果返回的是
int
,则返回
a.x
值的临时副本。
int addressofx();
...
const int& foo = a.addressofx();