dervish_candela: (Dervish)
[personal profile] dervish_candela
моя бошка уже немного пухнет, но вот что я понял.

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<T>, то есть std::is_constructible<T,T&&> (его можно сконструировать из rvalue)
например так работает конструктор копирования из T(const T&) и инициализирцет T из временного выражения &&T

иными словами, подвинуть некопируемый объект нельзя. никак. нихт. нада.
такие классы нужно инстанцировать в хозяйствующий указыватель unique_ptr<T> и передвигать это хозяйство с помощью std::move(unique_ptr<T>)
в частности, никак невозможно и нельзя подвинуть QObject, и это by design, именно потому что правильно скопировать identity class (уникальный объект) просто невозможно по определению.
для этого у них у всех запрещены конструктор T(const T&) и присваиватель T& operator=(const T&) макросом Q_DISABLE_COPY


а вот RVO всё может, потому что он не языковая механика, а компиляторная.

Date: 2017-02-15 02:20 am (UTC)
From: [identity profile] errorrishe.livejournal.com
Как хорошо что я 13 лет не трогал с++
Как говорил классик
>Покайтесь, браття, i не робiть х*йнi

April 2017

S M T W T F S
       1
234 5678
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 22nd, 2017 12:34 am
Powered by Dreamwidth Studios