Ваш первый код в порядке:
template<class T>
void fun(T&& t){
myhead_ = std::forward<T>(t).head_;
myrest_ = std::forward<T>(t).rest_;
}
Это потому, что стандарт гарантирует, что при выполнении a.b
и a
является значением xvalue (например, перенаправленной ссылкой на rvalue), результат a.b
также является exvalue (то есть может быть перемещен из). Также обратите внимание, что std::forward
и std::move
не выполняют никаких фактических перемещений , они просто являются приведениями. Таким образом, нет риска перейти от t
дважды в вашем коде.