Re: КОгда выбирается move-constructor?
От: N. I.  
Дата: 06.07.17 19:28
Оценка:
DTF:

DTF> Где в стандарте перечислены условия, при которых для конструирования объекта выбирается move-конструктор?


Если я ничего не забыл, то за исключением специальных случаев, описанных в [class.copy.elision], выбор делается по тем же правилам разрешения перегрузки, что и для обычных функций с rvalue reference параметром. Кандидаты формируются по [over.match.ctor] или [over.match.copy] в зависимости от контекста инициализации — см. [dcl.init].

DTF>Он не компилируется, т.к. у TOnlyMovable удален копирующий конструктор, а перемещающий конструктор (в строке "TOnlyMovable m(object);") почему-то не вызывается.

DTF>Почему?
DTF>Казалось бы, несмотря на то, что object — это lvalue

Вот потому и не компилируется. Чтобы проинициализировать rvalue ссылку перемещающего конструктора TOnlyMovable, lvalue типа TOnlyMovable в качестве инициализатора использовать нельзя — см. [dcl.init.ref]. А вот rvalue такого же типа — можно:

void foo(TOnlyMovable&& object) {
    TOnlyMovable m(std::move(object));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.