Информация об изменениях

Сообщение Re: перегрузка на const&& от 25.11.2023 1:24

Изменено 25.11.2023 1:33 rg45

Re: перегрузка на const&&
Здравствуйте, sergii.p, Вы писали:

SP>недавно столкнулся, что в операторе * для std::optional есть перегрузка на const&&


SP>
SP>constexpr const T&& operator*() const&& noexcept;
SP>


SP>Зачем это? Чем оно отличается от const& ?


std::optional является оберткой над произвольными типами, для которых, в общем случае, const& и const&& могут отличаться по семантике и доступным операциям. Поэтому, чтобы не вносить нежелательных спецеффектов просто предоставили полный набор всех возможных перегрузок, который гарантирует сохранение вида ссылки и модификаторов доступа при переходе от враппера к заврапленному значению.
Re: перегрузка на const&&
Здравствуйте, 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 задизайнен таким образом, чтоб не вносить никаких помех даже в самый безумный код.