相关疑难解决方法(0)

为什么`std :: move`命名为`std :: move`?

C++ 11 std::move(x)函数根本不会移动任何东西.它只是一个转换为r值.为什么这样做?这不是误导吗?

c++ c++-faq rvalue-reference move-semantics c++11

120
推荐指数
2
解决办法
1万
查看次数

std :: swap vs std :: exchange vs swap operator

的实现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还提出了一个内置的交换运算符,如下所示: …

c++ swap c++14

43
推荐指数
2
解决办法
9115
查看次数

标签 统计

c++ ×2

c++-faq ×1

c++11 ×1

c++14 ×1

move-semantics ×1

rvalue-reference ×1

swap ×1