std :: move передается по ссылке вместо вызова конструктора перемещения - PullRequest
0 голосов
/ 26 апреля 2020

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

using namespace std;

struct Bar {
    Bar(std::string a) : message{a} { cout << "default constructor" << endl; };

    Bar(const Bar& other) { cout << "copy constructor" << endl; };
    Bar(Bar&& other) noexcept { cout << "move constructor" << endl; };

    Bar& operator=(const Bar& other) = delete; //copy assignment
    Bar& operator=(Bar&& other) noexcept = delete; //move assignment

    ~Bar() { cout << "destroyed" << endl; }

    std::string message;
};


void Foo(Bar&& copy) {
        cout << copy.message << endl;
        copy.message = "Goodbye world...";
}

int main() {
        Bar b{ "Hello world!" };
        Foo(std::move(b));
        cout << b.message << endl;
}

Вывод не соответствует ожиданиям:

default constructor
Hello world!
Goodbye world...
destroyed
Program ended with exit code: 0

Я явно запрашиваю ссылку на rvalue в foo void Foo(Bar&& copy). Но я, кажется, передаю аргумент по ссылке (я не уверен, что это на самом деле происходит, но похоже, что так).

Я ожидал, что будет вызван конструктор move (I ' я звоню std::move в конце концов), но это не тот случай, кто-нибудь знает, что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...