Могу ли я делегировать Move Constructor? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть конструкторы копирования и конструкторы перемещения, определенные в классе Foo. При отладке я вхожу в f = CreateFoo(1, 1);, и это приводит меня к Foo(Foo&& other) : Foo(other, 0) {}. Следующий шаг приводит меня к Foo(Foo& other, int m) :x(other.x + m), y(other.y - m) {}, который является конструктором копирования. Я делегирую конструктор перемещения, ожидаю, что он выполняет Foo(Foo&& other, int m) : x(std::move(other.x)), y(std::move(other.y)). Я не понимаю почему? Кто-нибудь может мне помочь? Ниже приведена полная программа.

class Foo
{
public:
    int x;
    int y;
public:
    Foo(int i, int j) : x(i), y(j) {}
    Foo(Foo& other) : x(other.x), y(other.y) {}
    Foo(Foo& other, int m) :x(other.x + m), y(other.y - m) {}
    Foo(Foo&& other, int m) : x(std::move(other.x)), y(std::move(other.y))
    {
        x = x + m;
        y = y - m;
    }
    Foo(Foo&& other) : Foo(other, 0) {}
    Foo& operator=(const Foo& other) {
        x = other.x;
        y = other.y;
        return *this;
    }

    Foo& operator=(Foo&& other)
    {
        x = std::move(other.x);
        y = std::move(other.y);
        return *this;
    }
};

Foo CreateFoo(int x, int y)
{
    Foo tmp(x, y);
    return tmp;
}

int main()
{
    Foo f(0, 0);
    f = CreateFoo(1, 1);
    system("pause");
    return 0;
}

1 Ответ

2 голосов
/ 12 октября 2019
Foo(Foo&& other) : Foo(other, 0) {}

Здесь other - это lvalue (у него есть имя!). Вам необходимо снова делегировать вызов, используя std::move, чтобы сделать его xvalue:

Foo(Foo&& other) : Foo(std::move(other), 0) {}
...