c++ move semantics : БЕЗНОГNМ БЕЗλМНРIW

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

Previous post Next post
Up