Помогите разобраться с передаваемыми значениями в конструктор класса std::optional (& и &&)
Что должно передаваться в эти конструкторы класса:
constexpr optional( const optional& other );
constexpr optional( optional&& other ) noexcept();
В чем разница между & и && и зачем мы объявляем аргумент константным?
Ответы (1 шт):
optional&& other - это объявление rvalue-ссылки. Это ссылка на временный объект. Это позволяет компиляторам задействовать move-семантику, когда объекты не копируются, а получают ресурс. Одна из практик - запрет конструктора копирования, оставив только конструктор перемещения - тогда объекты можно только перемещать. Как пример - unique_ptr.
Аргумент optional( const optional& other ); объявляется константным, чтобы компилятор мог защитить программиста от ошибки - в теле функции не должно быть операций, изменяющих первоначальный объект, переданный по ссылке.