gpt4 book ai didi

C++:使用函数返回的对象

转载 作者:行者123 更新时间:2023-11-28 06:45:25 25 4
gpt4 key购买 nike

要使用函数返回的对象,谁能告诉我为什么在这段代码中情况 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
}

谢谢!

最佳答案

因为临时对象不能绑定(bind)到对非const 的左值引用。

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

void increment( int& value ) { ++value; }

可以这样称呼

auto main() -> int
{
increment( 2+2 );
}

但我不确定这是否完全令人信服。

规则确实有助于很多编码,但正如 Visual C++ 语言扩展(允许绑定(bind)类类型)所证明的那样,它并不重要,在普通代码中也不是什么大问题。


顺便提一下,临时对象不是const,除非它被声明为const。特别是您可以在其上调用非 const 成员函数,例如您的情况 f1().modify()。您只是不能将它绑定(bind)到对非 const 的左值引用。

关于C++:使用函数返回的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com