увы, не могу воспроизвести пример в хеловорде. телепаты приветствуются =)
есть приблизительно такой код:
struct type {
type(const type &) = delete;
type& operator= (const type &) = delete;
type(int fd) {}
type(type &&r) {} // 1: hand-writen move ctor
//type(type &&) = default; // 2:
};
type func(int fd) {
type r{fd};
return r; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
вопрос в том, почему при использовании "hand-writen move ctor" код компилится, но если его закомментить и раскомментить автосгенеренный — получаю "use of deleted function ‘type::type(type &&)" ?
структура 'type' на самом деле содержит "move-only" член.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>вопрос в том, почему при использовании "hand-writen move ctor" код компилится, но если его закомментить и раскомментить автосгенеренный — получаю "use of deleted function ‘type::type(type &&)" ?
Телепатирую: у type есть член, для которого нет move-конструктора.
Здравствуйте, niXman, Вы писали:
X>вопрос в том, почему при использовании "hand-writen move ctor" код компилится, но если его закомментить и раскомментить автосгенеренный — получаю "use of deleted function ‘type::type(type &&)" ?
Deleted implicitly-declared move constructor
The implicitly-declared or defaulted move constructor for class T is defined as deleted if any of the following is true:
T has non-static data members that cannot be moved (have deleted, inaccessible, or ambiguous move constructors);
T has direct or virtual base class that cannot be moved (has deleted, inaccessible, or ambiguous move constructors);
T has direct or virtual base class with a deleted or inaccessible destructor;
T is a union-like class and has a variant member with non-trivial move constructor;
T has a non-static data member or a direct or virtual base without a move constructor that is not trivially copyable.
(until C++14)
The deleted implicitly-declared move constructor is ignored by overload resolution (otherwise it would prevent copy-initialization from rvalue).
(since C++14)
niXman:
BFE>>Телепатирую: у type есть член, для которого нет move-конструктора.
X>все верно! да и логично это...
X>спасибо!
Само по себе наличие или отсутствие move конструкторов у членов тут не является определяющим фактором, поскольку объект может перемещаться без использования move конструктора — например, копирующим конструктором:
Здравствуйте, N. I., Вы писали:
BFE>>>Телепатирую: у type есть член, для которого нет move-конструктора.
NI>Само по себе наличие или отсутствие move конструкторов у членов тут не является определяющим фактором, поскольку объект может перемещаться без использования move конструктора — например, копирующим конструктором:
Я думаю, что имелось в виду, что есть член, для которого запрещено перемещение.