Я пытаюсь обернуть голову в семантику перемещения в 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
в конце концов), но это не тот случай, кто-нибудь знает, что происходит?