Конструктор по умолчанию, который вызывает одноранговый конструктор с перемещением unique_ptr - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь создать класс с двумя конструкторами. Один из них является конструктором по умолчанию, а другой вызывает параметризованный конструктор. Я получаю ошибку компилятора, которая говорит мне, что я не могу использовать перемещение на только что созданном объекте, и я вроде понимаю, что ему это не нравится, потому что здесь нет реального назначения.

Как я могу добиться правильного поведения? Я пытаюсь избежать написания двух конструкторов, которые инициализируют переменные. Функция инициализации могла бы работать, но тогда мне пришлось бы заполнить тело конструкторов, и я пытался найти точное решение, как показано ниже.

#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)

1008 *

1 Ответ

0 голосов
/ 30 января 2020

Я решил go для конструктора rvalue. Это, кажется, решает проблему для меня.

#include <string>
#include <iostream>
#include <memory>

using namespace std;

class Foo
{
public:
    // rvalue constructor so that we can move the unique_ptr.
    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();

    unique_ptr<int> a = make_unique<int>(33);
    Foo f2(move(a)); // important to do a move here, because we need an rvalue.
    f2.print();


    return 0;
}
...