重新实现std :: swap,我应该使用const作为tmp变量吗?

时间:2013-07-19 19:10:35

标签: c++ stl swap

我正在尝试从C ++ STL库重新实现一些方法。关于通用交换实现还有一个问题:我是否应该对临时变量使用const修饰符?

有我的变体:

template<typename T>
void swap(T& a, T& b)
{
  const T tmp = a;
  a = b;
  b = tmp;
}

更新:

我检查了几个STL实现;有些人正在使用const,而有些则没有。

我认为,使用const可能会限制swap ...

的普遍性

我想编写可移植的实现,这是最通用的(接受大多数类)。

2 个答案:

答案 0 :(得分:4)

这是你应该怎么做的,也就是为什么tmp不应该是const:

 template<typename T>
 void swap(T& a, T& b)
 {
   T tmp = std::move(a);
   a = std::move(b);
   b = std::move(tmp);//needs to change tmp, so tmp cannot be const
 }

这允许移动分配tmp(如果可能的话)。

但是,这有很多细微差别。

答案 1 :(得分:1)

const是编写正确程序的帮助。编译器会验证您是否违反了此合同。作者或读者知道该值,因为它在初始化后不会改变。在这种情况下,变量的范围非常小,功能非常简单,但不会产生任何影响。保持它的一致性,它不会受到伤害。