使用从函数返回的对象
C++: use returned object from function
要使用从函数返回的对象,谁能告诉我为什么情况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)); }
,之后你必须处理删除这个对象
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用