перегрузка на const&&
От: sergii.p  
Дата: 24.11.23 11:09
Оценка:
недавно столкнулся, что в операторе * для 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
Re: перегрузка на const&&
От: reversecode google
Дата: 24.11.23 13:26
Оценка:
насколько понимаю действие над умирающим обьектом

*std::optional<std::string>("123456")
Re: перегрузка на const&&
От: rg45 СССР  
Дата: 25.11.23 01:24
Оценка: 5 (2) +1
Здравствуйте, 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 задизайнен таким образом, чтоб не вносить никаких помех даже в самый безумный код.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 25.11.2023 1:33 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.