Код: Выделить всё
auto fun(std::vector&& v) {
std::vector w;
for (auto&& e : v /* not an rvalue, but keep reading */) {
w.push_back(std::move(e));
}
// do stuff with w
}
С другой стороны, v наверняка привязывается к значению prvalue или xvalue (которое клиент знает или хочет с удовольствием рассматривать как временный), поскольку его тип является ссылкой rvalue. Да, я вижу, что в теле функции никоим образом не указано, что v нельзя использовать после цикла for, но это только навело бы меня на мысль, что мне следует изменить
- для for (auto&& e : std::move(v)),
Код: Выделить всё
for (auto&& e : v) - и auto&& для E&&, предполагая что-то вроде использования E = std::decay_t::value_type;.
В качестве дополнительной ссылки примечание ¹ из этого ответа гласит (со ссылкой на диапазон-
Код: Выделить всё
forВы не можете определить, выполняете ли вы итерацию по временному (или другому r-значению)
что, похоже, подтверждает, что я просто не могу этого сделать.
Но глядя на то, как работает диапазон-
Код: Выделить всё
forЦикл Код: Выделить всё
range-expressionПодробнее здесь: https://stackoverflow.com/questions/747 ... hether-its
Мобильная версия