Во-первых, вероятно, в вопросе, который я рассмотрю, есть заблуждение:
Когда вы видите 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