【发布时间】:2019-06-19 20:14:21
【问题描述】:
在 cppreference.com 上了解 std::exchange 时,我遇到了粘贴在下面的“可能实现”。
template<class T, class U = T>
T exchange(T& obj, U&& new_value)
{
T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value;
}
在赋值语句中看到 obj = std::forward 而不是 std::move 看起来有点奇怪,我认为这会产生相同的效果。
我的理解是std::move 相当于static_cast 到右值引用类型(但更具表现力)并且总是返回一个xvalue,而std::forward 返回它传递的相同值类型。
我的问题是为什么在上面的 sn-p 中使用std:forward?是否有一个简单的经验法则来决定何时这是更好的选择?
【问题讨论】:
标签: c++ move-semantics perfect-forwarding