В следующем коде я явно запретил копирование и перемещение объекта Dummy
с использованием спецификатора delete
для конструкторов копирования и перемещения и операторов копирования и перемещения:
#include <string>
#include <iostream>
struct Dummy
{
explicit Dummy(const std::string& value) : value_(value) {}
Dummy(const Dummy&) = delete;
Dummy& operator=(const Dummy&) = delete;
Dummy(Dummy&&) = delete;
Dummy& operator=(Dummy&&) = delete;
void print_this_address() const
{
std::cout << "this address: " << this << "\n";
}
std::string value_;
};
void foo(Dummy&& obj)
{
std::cout << obj.value_ << "\n";
obj.print_this_address();
}
int main()
{
Dummy obj("42");
obj.print_this_address();
foo(std::move(obj));
std::cout << obj.value_ << "\n";
return 0;
}
Этот код компилируется и выполняетсяхорошо, и я получаю следующий вывод в моем терминале:
this address: 0x7ffeeb6d2a20
42
this address: 0x7ffeeb6d2a20
42
Может кто-нибудь объяснить мне, что происходит в этом коде и почему я не получил ошибку компиляции и у меня тот же объект в foo
функционировать как в main
.функционировать?