为什么我不应该为我的类型提供前进和移动版本?

问题描述

我使用过 std::swapstd::movestd::forward,但建议我不要重载后两个,因为它们已经有可以保存任何类型值的参数例如一个预测参考。所以我应该完全限定对这两个函数调用

std::move(x);
std::forward<T&&>(x);

而且我已经读到我可以提供我自己的 swap 版本,因此我只为标准库添加一个使用声明,然后调用 swap 而不对其进行限定(非限定查找):

using std::swap;// in case my class doesn't provide a swap version

swap(x,y); // where x,y are of class type. so don't use std::swap directly
  • 那么为什么我不应该为我的类型也提供 std::movestd::forward 的版本?

  • 这是否意味着如果我提供版本,没有任何好处,因为库的更像是证明排序函数,而库的要好得多?

解决方法

只有在标准允许的情况下,您才可以提供 std 函数的特化。没有为 std::movestd::forward 授予此类权限。这样做会使您的程序格式错误,无需诊断。

std::swap 你应该只在默认实现有效率问题时专门化(而不是超载!)。默认实现基本上是:

void std::swap( T& lhs,T& rhs ) {
  auto tmp = std::move(lhs);
  lhs = std::move(rhs);
  rhs = std::move(tmp);
}

最常见的情况是您的类型需要在“空”时分配内存。更有效的交换可以避免这种分配。

但对于大多数类型来说,这不是问题。