我有一个错误消息说,没有构造函数匹配的参数列表,但当我删除用户定义复制构造函数时,错误被修复,请帮助我找到错误。
#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;
}
2条答案
按热度按时间62lalag41#
引用为
const
。一个临时变量(就像函数的返回值)可以绑定到一个适当类型的
const&
,但不能绑定到一个非const左值引用,因为它没有实际的名称。bmp9r5qi2#
f()
的返回值是一个临时值和一个右值。基本上,它不能绑定到a&
,a&
是对左值的引用(简单地说,是一个具有特定生存期的“普通”对象)。要使用
f()
初始化对象,有两种解决方案:变更为:
就像你可以将一个临时变量绑定到一个常量的引用一样。
或:
因为它是用于绑定右值的正确签名。
后一种形式称为move constructor,而第一种形式是复制构造函数的正确签名。