无法用函数的返回值初始化对象。为啥? [复制]
Posted
技术标签:
【中文标题】无法用函数的返回值初始化对象。为啥? [复制]【英文标题】:Cannot initialize object with returning value of a function.. Why? [duplicate]无法用函数的返回值初始化对象。为什么? [复制] 【发布时间】:2021-09-10 20:38:50 【问题描述】:我编写了这个简单的代码来理解 C++ 中复制构造函数的功能。当我直接用“obj1”初始化“obj2”时,它工作正常。但是当我尝试使用函数“func()”的返回对象初始化“obj2”时,它显示错误:
错误:无法将“MyInt&”类型的非常量左值引用绑定到“MyInt”类型的右值
为什么会这样?
代码:
#include<bits/stdc++.h>
using namespace std;
class MyInt
int x;
public:
MyInt()
cout<< "default constructor called" << endl;
MyInt(int x)
cout<< "constructor with initializer called" << endl;
this->x = x;
MyInt(MyInt& obj)
this->x = obj.x;
cout<< "copy constructor called" << endl;
~MyInt()
cout<< "destructor called" << endl;
;
MyInt func(MyInt obj)
return obj;
int main()
MyInt ob1(2);
//MyInt ob2 = ob1; //works perfectly fine: "copy constructor called"
MyInt ob2 = func(ob1); //giving error
【问题讨论】:
请注意,您的复制构造函数的格式为MyInt(MyInt& obj)
而不是MyInt(const MyInt& obj)
。在 C++ 中,您 cannot 将纯右值(如 func()
的返回值)绑定到非 const 左值引用。
我想我错过了这个,因为强制复制省略。
不相关:必须链接到Why should I not #include <bits/stdc++.h>? 但是如果你仍然使用它并将它与 using namespace std; 结合起来,things can get really weird。
也许您可以解释一下您做什么和不了解错误消息?对“为什么”有任何回答?可能会尝试猜测如何改写该消息。你知道什么是右值吗?你知道它不能绑定到诸如MyInt&
这样的非常量引用吗?
【参考方案1】:
你已经定义了这个构造函数:
MyInt(MyInt& obj)
this->x = obj.x;
cout<< "copy constructor called" << endl;
参数MyInt& obj
是引用,不是const
。
这表示您希望能够对其读取和写入。
C++ 将通过不允许将 临时(也称为“右值”)作为此参数传递来保护您免受某些错误的影响。因为写临时文件几乎可以肯定是一个错误。无论你写什么都会丢失。
但是,您的函数不会写入该参数。您可以通过将其设为const
来表明您不打算写入参考。
MyInt(const MyInt& obj)
this->x = obj.x;
cout<< "copy constructor called" << endl;
此更改将允许将临时对象传递给此构造函数。
【讨论】:
以上是关于无法用函数的返回值初始化对象。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章