Во-первых, вероятно, в вопросе, который я рассмотрю, есть заблуждение:
Когда вы видите T&& t в коде (а T - это фактический тип, а не тип шаблона), имейте в виду, что категория значений t - это lvalue (ссылка ), а не rvalue (временное). Это очень сбивает с толку. T&& просто означает, что t построен из объекта, который был rvalue 1, но t сам является lvalue, а не rvalue. Если у него есть имя (в данном случае t), то это lvalue и не будет автоматически перемещаться, но если у него нет имени (результат 3+4), то это rvalue и будет автоматически перейти к его результату, если может. Тип (в данном случае T&&) почти не имеет ничего общего с категорией значения переменной (в данном случае lvalue).
При этом, если в вашем коде написано T&& t, это означает, что у вас есть ссылка на переменную, которая была временной, и ее можно уничтожить, если вы хотите. Если вам нужно обращаться к переменной несколько раз, вы не хотите std::move из нее, иначе она потеряет свое значение. Но в последний раз, когда вы переходите t, безопасно std::move это значение для другого T, если хотите. (И в 95% случаев это то, что вы хотите делать). Все это относится и к auto&& переменным.
1. если T - тип шаблона, T&& - это ссылка переадресации, и в этом случае вы используете std::forward<T>(t) вместо std::move(t) в последний раз. См. этот вопрос.
person
Mooing Duck
schedule
23.01.2013