move-ctor
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.04.19 11:08
Оценка:
привет!

увы, не могу воспроизвести пример в хеловорде. телепаты приветствуются =)

есть приблизительно такой код:
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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 02.04.2019 11:08 niXman . Предыдущая версия .
Re: move-ctor
От: B0FEE664  
Дата: 02.04.19 11:14
Оценка: +3
Здравствуйте, niXman, Вы писали:

X>вопрос в том, почему при использовании "hand-writen move ctor" код компилится, но если его закомментить и раскомментить автосгенеренный — получаю "use of deleted function ‘type::type(type &&)" ?


Телепатирую: у type есть член, для которого нет move-конструктора.
И каждый день — без права на ошибку...
Re: move-ctor
От: Maniacal Россия  
Дата: 02.04.19 11:21
Оценка: +1
Здравствуйте, 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)

Re[2]: move-ctor
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.04.19 11:38
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Телепатирую: у type есть член, для которого нет move-конструктора.


все верно! да и логично это...

спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: move-ctor
От: N. I.  
Дата: 03.04.19 13:37
Оценка: +1
niXman:

BFE>>Телепатирую: у type есть член, для которого нет move-конструктора.


X>все верно! да и логично это...


X>спасибо!


Само по себе наличие или отсутствие move конструкторов у членов тут не является определяющим фактором, поскольку объект может перемещаться без использования move конструктора — например, копирующим конструктором:

https://wandbox.org/permlink/wgbGuTgsxBkeTH7E
Re[4]: move-ctor
От: rg45 СССР  
Дата: 05.04.19 16:53
Оценка:
Здравствуйте, N. I., Вы писали:

BFE>>>Телепатирую: у type есть член, для которого нет move-конструктора.


NI>Само по себе наличие или отсутствие move конструкторов у членов тут не является определяющим фактором, поскольку объект может перемещаться без использования move конструктора — например, копирующим конструктором:


Я думаю, что имелось в виду, что есть член, для которого запрещено перемещение.
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.