【发布时间】:2018-10-13 11:14:25
【问题描述】:
我有一个函数可能会移动一个通用参数,但通过它们的成员。这些选项中哪个更正确:
-
这看起来更自然,但很奇怪,因为参数可能会移动两次 [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(如std::move)实际上并没有移动任何东西。最多移动成员(通过后续操作decltype(myhead)::operator=,但这正是目标。)
【问题讨论】:
标签: c++11 move-semantics class-members forwarding-reference