使用从函数返回的对象

C++: use returned object from function

本文关键字:对象 返回 函数      更新时间:2023-10-16

要使用从函数返回的对象,谁能告诉我为什么情况1,3,4是可以的,但不是2在这个代码?

#include <iostream>
using namespace std;
class X {
    int i;
public:
    X(int ii = 0) : i(ii) {};
    void modify() { i++; };
};
X f1() { return X(1); }
// Pass by non-const reference
void f20(X& x) { x.modify(); }
// Pass by const reference
void f21(const X& x) { }
// Pass by value
void f22(X x) { x.modify(); }
int main() {
    f1() = X(2); // 1. OK
    //! f20(f1());   // 2. Bad
    f21(f1());   // 3. OK
    f22(f1());   // 4. OK
}

谢谢!

因为临时变量不能绑定到非const的左值引用

我看到的主要理由是,否则(与Visual c++语言扩展一样)像

这样的函数
void increment( int& value ) { ++value; }

可以像

那样调用
auto main() -> int
{
    increment( 2+2 );
}

但我不确定这是否完全有说服力。

这些规则确实对很多编码有帮助,但是作为Visual c++语言扩展(允许绑定类类型)的例子,它在普通代码中并不重要,也不是什么大问题。


顺便说一下,请注意临时对象不是const,除非它被声明为这样。特别地,你可以在上面调用非const成员函数,就像你的f1().modify()一样。您只是不能将其绑定到非const的左值引用。

f1()方法返回x类型的临时对象

=操作符可以应用于X类型的对象,即使对象本身在操作之后将不可用。

f21()期望const引用(即在该函数中不应该改变的东西),因此不检查引用是否有效。

f22()期望值本身,它在函数内部被修改,然后修改将丢失。

f20()需要引用,即在函数内部所做的更改应该应用于该函数外部存在的对象。但是它得到了一个对临时对象的引用,因此出现了问题。

如果你想返回对非临时对象的引用,你的函数应该是这样的:

X& f1() { return *(new X(1)); }

,之后你必须处理删除这个对象