无法用函数的返回值初始化对象。为啥? [复制]

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&amp; obj) 而不是MyInt(const MyInt&amp; obj)。在 C++ 中,您 cannot 将纯右值(如 func() 的返回值)绑定到非 const 左值引用。 我想我错过了这个,因为强制复制省略。 不相关:必须链接到Why should I not #include <bits/stdc++.h>? 但是如果你仍然使用它并将它与 using namespace std; 结合起来,things can get really weird。 也许您可以解释一下您做什么了解错误消息?对“为什么”有任何回答?可能会尝试猜测如何改写该消息。你知道什么是右值吗?你知道它不能绑定到诸如MyInt&amp; 这样的非常量引用吗? 【参考方案1】:

你已经定义了这个构造函数:

MyInt(MyInt& obj) 
    this->x = obj.x;
    cout<< "copy constructor called" << endl;

参数MyInt&amp; obj是引用,不是const

这表示您希望能够对其读取写入

C++ 将通过不允许将 临时(也称为“右值”)作为此参数传递来保护您免受某些错误的影响。因为写临时文件几乎可以肯定是一个错误。无论你写什么都会丢失。

但是,您的函数不会写入该参数。您可以通过将其设为const 来表明您不打算写入参考。

MyInt(const MyInt& obj) 
    this->x = obj.x;
    cout<< "copy constructor called" << endl;

此更改将允许将临时对象传递给此构造函数。

【讨论】:

以上是关于无法用函数的返回值初始化对象。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++的复制构造函数

复制构造函数的运用

显式复制构造函数和统一初始化

递归幂函数:如果没有初始返回值,为啥会这样?

如果结构是值类型,为啥我可以新建它? [复制]

无法使用“Shape *”类型的左值初始化“Shape Shape::*”类型的返回对象