我正在尝试使用两个构造函数创建一个类。一个是默认构造函数,另一个是参数化构造函数。我收到一个编译器错误,告诉我不能在刚刚创建的对象上使用move,并且我有点理解它不喜欢这样做,因为这里没有真正的赋值。
如何实现正确的行为?我试图避免编写两个初始化变量的构造函数。初始化函数可能会起作用,但随后我将不得不填充构造函数的主体,而我试图提供一个如下所示的简洁解决方案。
#include <string>
#include <iostream>
#include <memory>
using namespace std;
class Foo
{
public:
Foo(unique_ptr<int>& number) : m_number(move(number))
{
}
Foo() : Foo(make_unique<int>(54))
{
}
void print()
{
cout << m_number << endl;
}
private:
unique_ptr<int> m_number;
};
int main()
{
Foo f;
f.print();
return 0;
}
main.cpp:18:33:错误:非常量引用的初始化无效类型为右值的类型为“ std :: unique_ptr&”的类型‘std :: _ MakeUniq :: __ single_object {aka std :: unique_ptr}’Foo():Foo(make_unique(54))
您不能引用rvalue
对象。这正是您要在第一个构造函数中执行的操作,rvalue
是您要在第二个构造函数中创建的操作。除其他外,在打印时,您必须取消引用unique_ptr
以获得其值。
#include <string>
#include <iostream>
#include <memory>
using namespace std;
class Foo
{
public:
Foo(unique_ptr<int> number) : m_number(move(number))
{}
Foo() : Foo(make_unique<int>(54))
{}
void print()
{
cout << *m_number << endl;
}
private:
unique_ptr<int> m_number;
};
int main()
{
Foo f;
f.print();
return 0;
}