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

Cannot initialize object with returning value of a function.. Why? [duplicate]

提问人:madina11906036 提问时间:9/11/2021 更新时间:9/11/2021 访问量:340

问:

我编写了这个简单的代码来了解 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
}
C++ 初始化 复制构造函数

评论

6赞 Nathan Pierson 9/11/2021
请注意,您的复制构造函数的格式为 not .在 C++ 中,不能将纯右值(如返回 of )绑定到非常量左值引用。MyInt(MyInt& obj)MyInt(const MyInt& obj)func()
0赞 user4581301 9/11/2021
我想我错过了这个,因为强制性的复制省略。
1赞 user4581301 9/11/2021
无关:为什么我不应该 #include < bits/stdc++.h>的强制性链接?但是,如果你仍然使用它,并将其与使用命名空间 std; 结合起来,事情会变得非常奇怪
3赞 Drew Dormann 9/11/2021
也许您可以解释一下您对错误消息的理解理解的内容?对“为什么?”的任何回答都可能是试图猜测如何重新表述该信息。你知道什么是右值吗?你知道它不能绑定到一个非常量引用,比如?MyInt&

答:

1赞 Drew Dormann 9/11/2021 #1

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

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

该参数是引用,它不是 .MyInt& objconst

这表明您希望能够读取写入它。

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

但是,您的函数不会写入该参数。您可以通过使 .const

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

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