Добрый вечер?
Короткий вопрос:
Где в стандарте перечислены условия, при которых для конструирования объекта выбирается move-конструктор?
Сам не нахожу
Тот же вопрос подробнее:
Вот есть код:
class TOnlyMovable {
public:
TOnlyMovable() = default;
TOnlyMovable(TOnlyMovable&&) {}
};
void foo(TOnlyMovable&& object) {
TOnlyMovable m(object);
}
int main() {
foo( TOnlyMovable() );
return 0;
}
Он не компилируется, т.к. у TOnlyMovable удален копирующий конструктор, а перемещающий конструктор (в строке "TOnlyMovable m(object);") почему-то не вызывается.
Почему?
Казалось бы, несмотря на то, что object — это lvalue (я не ошибаюсь тут?), его тип — rvalue reference,
из чего можно сделатть вывод, что перемещать из этого объекта можно и нужно.