Здравствуйте, _hum_, Вы писали:
__>>>[/ccode]
__>>>Но насколько оно соответствует заявленной цели,
I>>По виду не соответсвует, clone != move, у тебя после такого clone сам объект теряет владение над m_ui
__>ммм... я же копию создаю и ее перемещаю, а не исходный объект. Потому ничего он, вроде, не теряет.
Да, всё верно, я чего то под вечер подумал что CA(CA&&)=default; будет вызываться
__>>>и может, есть что-нибудь красивее?
I>>Ну, сама идея вроде правильная, пишем operator = в private и в public clone используем, придется да акуратно написать копирование, других вариантов в голову не приходит
__>>>(И, на всякий случай, есть ограничения — в функции clone нельзя использовать работу с динамической памятью).
I>>С таким ограничением непонятно как это сделать, если только переопределять new и использовать заранее выделеную память
__>может, как-то можно в clone передавать какой-нибудь пользовательский constructor-allocator, чтоб с его помощью создавать объект и возвращать указатель (чтобы можно было и конструктор перемещения закрыть в private)?
А чем мешает move? Сейчас при clone выполняется выделение памяти, так как объект создается, можно либо использовать память
char *buf = new char[1000]; //pre-allocated buffer
CA *p = new (buf) CA(); //placement new
либо заранее создать пул объектов выдергивать объект из пула клонировать значения полей, когда он не нужен возвращать в пул
void clone(CA& toClone){
toClone.set( get() );
}
Откуда ограничение что "clone нельзя использовать работу с динамической памятью"?