c++ 调用具有函数作为实际参数的复制构造函数时出错

ffdz8vbo  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(175)

我有一个错误消息说,没有构造函数匹配的参数列表,但当我删除用户定义复制构造函数时,错误被修复,请帮助我找到错误。

#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<climits>
#include<cstdlib>
#include<numeric>
#include<vector>
#include<utility>
#include<set>
#include<unordered_set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
class a
{
public :
    a(a& x)
    {
        cout << 1 << endl;
    }
    a() {}
};
a f()
{
    a aa;
    return aa;
}
int main(void)
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    a aa(f());


    return 0;
}
62lalag4

62lalag41#

引用为const

a(const a& x)
{
    cout << 1 << endl;
}

一个临时变量(就像函数的返回值)可以绑定到一个适当类型的const&,但不能绑定到一个非const左值引用,因为它没有实际的名称。

bmp9r5qi

bmp9r5qi2#

f()的返回值是一个临时值和一个右值。基本上,它不能绑定到a&a&是对左值的引用(简单地说,是一个具有特定生存期的“普通”对象)。
要使用f()初始化对象,有两种解决方案:
变更为:

a(const a& x)

就像你可以将一个临时变量绑定到一个常量的引用一样。
或:

a(a&& x)

因为它是用于绑定右值的正确签名。
后一种形式称为move constructor,而第一种形式是复制构造函数的正确签名。

相关问题