От этот ссылка, это позволяет const
Значение как конструктор перемещения
Type::Type( const Type&& other );
Как может быть подвижный объект const
? Даже если бы это было технически разрешено, есть ли такой случай, когда такое заявление было бы полезно?
Как может быть подвижный объект
const
?
Не может, но это не то, что говорит язык. Язык говорит, что конструктор с такой сигнатурой является «конструктором перемещения», но это не означает, что аргумент перемещается, а просто означает, что конструктор отвечает требованиям «конструктора перемещения». Конструктор перемещения не требуется ничего перемещать, и если аргумент const
это не может
Есть ли случай, когда такая декларация будет полезна?
Да, но не очень часто. Это может быть полезно, если вы хотите предотвратить выбор другого конструктора с помощью разрешения перегрузки, когда в качестве аргумента передается константное временное значение.
struct Type
{
template<typename T>
Type(T&&); // accepts anything
Type(const Type&) = default;
Type(Type&&) = default;
};
typedef const Type CType;
CType func();
Type t( func() ); // calls Type(T&&)
В этом коде временное возвращение из func()
не будет точно соответствовать параметрам копирования или перемещения конструкторов, поэтому вызовет конструктор шаблона, который принимает любой тип. Чтобы предотвратить это, вы можете предоставить другую перегрузку, принимающую const rvalue, и либо делегировать ее конструктору копирования:
Type(const Type&& t) : Type(t) { }
Или, если вы хотите предотвратить компиляцию кода, определите его как удаленный:
Type(const Type&& t) = delete;
Увидеть https://stackoverflow.com/a/4940642/981959 для примеров из стандарта, которые используют константную ссылку.
Некоторая информация о намерениях этой функции.
Rvalue ссылки — Из блога Бьярна Страуструпа
Предложение добавить поддержку семантики Move в язык C ++
Интересный вопрос Я где-то читал объяснение этого вопроса Страуструпа, но, похоже, не могу его найти. Надеюсь, что вышеупомянутое помогает вместо него.