我有一个函数可能会移动一个通用参数,但通过它们的成员。这些选项中哪个更正确:
这看起来更自然,但很奇怪,因为参数可能会移动两次 [a],这很奇怪,因为对象可能会变得无效。
template<class T> void fun(T&& t){ myhead_ = std::forward<T>(t).head_; myrest_ = std::forward<T>(t).rest_; }
这不可能是不正确的,但它可能不会移动任何东西。
template<class T> void fun(T&& t){ myhead_ = std::forward<decltype(t.head_)>(t.head_); myrest_ = std::forward<decltype(t.rest_)>(t.rest_); }
这似乎是正确的,但代码太多。
template<class T> void fun(T& t){ myhead_ = t.head_; myrest_ = t.rest_; } template<class T> void fun(T&& t){ myhead_ = std::move(t.head_); myrest_ = std::move(t.rest_); }
[a] 正如@Angew 指出的那样,该语句是不正确的,它看起来好像被移动了两次。std::forward
(like std::move
) 实际上并没有移动任何东西。最多移动成员(通过后续操作decltype(myhead)::operator=
,但这正是目标。)