默认构造函数,它通过unique_ptr移动调用对等构造函数

问题描述 投票:0回答:1

我正在尝试使用两个构造函数创建一个类。一个是默认构造函数,另一个是参数化构造函数。我收到一个编译器错误,告诉我不能在刚刚创建的对象上使用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))

c++ c++14 unique-ptr
1个回答
0
投票

您不能引用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.