C++ 11 std::move(x)函数根本不会移动任何东西.它只是一个转换为r值.为什么这样做?这不是误导吗?
的实现std::swap可能是这样的:
template <class T> void swap (T& a, T& b)
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template <class T, size_t N> void swap (T (&a)[N], T (&b)[N])
{
for (size_t i = 0; i<N; ++i) swap (a[i],b[i]);
}
Run Code Online (Sandbox Code Playgroud)
实现std::exchangen3668可能如下所示:
template< typename T, typename U = T >
T exchange( T & obj, U && new_val )
{
T old_val = std::move(obj);
obj = std::forward<U>(new_val);
return old_val;
}
Run Code Online (Sandbox Code Playgroud)
它说:
对于原始类型,这相当于明显的实现,而对于更复杂的类型,这个定义
- 当该类型定义移动构造函数时,避免复制旧值
- 接受任何类型作为新值,利用任何转换赋值运算符
- 如果它是临时的或移动的,则避免复制新值.
我选择了与atomic_exchange对称的名称,因为它们的行为相同,除了这个函数不是原子的.
n3746还提出了一个内置的交换运算符,如下所示: …