Feb 14, 2017 16:09
моя бошка уже немного пухнет, но вот что я понял.
std::move(x) ничего не двигает. оно просто приводит тип к rvalue (&&x), то есть мы явно говорим что объект x нам больше не нужен.
втихую move contructor генерится только для POD (не совсем так, но смысл именно такой).
совершенно точно нельзя передвинуть класс, если у него явно запрещён copy contructor и при этом не определён явно move contructor.
есть некий middle gorund вида const T& ← &&T , то есть rvalue will bind to a const lvalue reference
то есть, класс с нетривиальным конструктором можно передвинуть, если он is_move_contructible, то есть std::is_constructible (его можно сконструировать из rvalue)
например так работает конструктор копирования из T(const T&) и инициализирует T из временного выражения &&T
иными словами, подвинуть некопируемый объект нельзя. никак. нихт. нада.
такие классы нужно инстанцировать в хозяйствующий указыватель unique_ptr и передвигать это хозяйство с помощью std::move(unique_ptr)
в частности, никак невозможно и нельзя подвинуть QObject, и это by design, именно потому что правильно скопировать identity class (уникальный объект) просто невозможно по определению.
для этого у них у всех запрещены конструктор T(const T&) и присваиватель T& operator=(const T&) макросом Q_DISABLE_COPY
а вот RVO всё может, потому что он не языковая механика, а компиляторная.
программирование - это 52% религии,
c++,
orz