Tricky move
#новичкам
В
прошлом посте специально была допущена определенная неточность. Скомпилировав этот код:
struct Example {
~Example() {}
};
Example a;
Example b;
a = std::move(b);
Вы не получите ошибку компиляции и все запустится без проблем.
Просто код будет работать не совсем так, как вы ожидаете.
Вы резонным образом ожидаете, что в последней строчке вызовется присваивание перемещением.
Однако вызовется копирующее присваивание.
#ЧЗХ?
В том же посте мы выяснили, что определение деструктора запрещает генерироваться перемещающим операциям.
Но не мешает копирующим!
Ну и дальше классика. В С++ если вы ожидаете перемещения чего-либо при вызове std::move - вините свои ожидания, когда все идет по звезде.
Результат вызова std::move - rvalue reference aka &&. А правые ссылки спокойно биндятся к const &. И именно такой тип параметра принимает копирующее присваивание.
Есть подходящий кандидат для перегрузки, он и вызывается.
Еще один прикол на стыке легаси С++ и его модерновой версией.
See through tricks. Stay cool.
#cpp11
Обсуждение 4
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram