недавно столкнулся, что в операторе * для std::optional есть перегрузка на const&&
constexpr const T&& operator*() const&& noexcept;
Зачем это? Чем оно отличается от
const& ?
Думал, может оно крадёт значение из константы. Так нет вроде.
const std::optional<std::string> s = "123456789";
const auto s2 = *std::move(s);
std::cout << *s; // prints 123456789
Здравствуйте, sergii.p, Вы писали:
SP>недавно столкнулся, что в операторе * для std::optional есть перегрузка на const&&
SP>SP>constexpr const T&& operator*() const&& noexcept;
SP>
SP>Зачем это? Чем оно отличается от const& ?
std::optional является оберткой над произвольными типами, для которых, в общем случае, const& и const&& могут отличаться по семантике и доступным операциям. Поэтому, чтобы не вносить нежелательных спецеффектов, просто предоставили полный набор всех возможных перегрузок, который гарантирует сохранение вида ссылки и модификаторов доступа при переходе от враппера к заврапленному значению.
Ну, например, можно представить себе что-то типа такого:
struct Foo
{
void bar() const&&;
void bar() const& = delete;
};
const std::optional<Foo> baz();
Зачем такое кому-то может понадобиться — это уже второй вопрос. Просто std::optional задизайнен таким образом, чтоб не вносить никаких помех даже в самый безумный код.