Какие документы WG21 объясняют решение не включать квалификаторы ссылок в большинство классов стандартных библиотек?
Пример, который выиграет от такого включения:
template <class C1, class C2>
C1 container_cast(C2&& source)
{
C1 dest;
// if constexpr(can do so) dest.reserve(source.size());
for(auto&& element : std::forward<C2>(source))
{
dest.emplace_back(std::forward<decltype(element)>(element));
}
return dest;
}
Однако никакие методы доступа к членам контейнера не распространяют на них rvalue, вызывая ненужные копии. Это отличается, например, от std::get(std::tuple) и std::Optional::operator *, которые предоставляют перегрузки всех видов, включая оксюморон «const &&».
(Тесно связано с квалификаторами rvalue ref для контейнеров STL, но вопрос более конкретен.)
make_move_container
, который будет вызыватьmake_move_iterator
дляbegin
/end
? - person Jarod42   schedule 26.08.2019begin
иend
не продвигаются к move_iterators по умолчанию и требуют немного больше работы, чтобы выполнить то, что вы хотите. - person Frank   schedule 26.08.2019