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

C++ 为什么我不应该为我的类型提供前进和移动版本?,c++,move,swap,forward,C++,Move,Swap,Forward,我使用了std::swap、std::move和std::forward,但建议不要重载后两个,因为它们已经有了可以保存任何类型值的参数,例如forearding引用。因此,我应该充分验证对这两个函数的调用: std::move(x); std::forward<T&&>(x); 那么为什么我不应该为我的类型提供std::move和std::forward的版本呢 这是否意味着如果我提供了版本,就没有任何好处,因为库的更像是证明排序函数,而库的更好 只有在标准允许的

我使用了std::swap、std::move和std::forward,但建议不要重载后两个,因为它们已经有了可以保存任何类型值的参数,例如forearding引用。因此,我应该充分验证对这两个函数的调用:

std::move(x);
std::forward<T&&>(x);
那么为什么我不应该为我的类型提供std::move和std::forward的版本呢

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


只有在标准允许的情况下,才允许您提供std功能的专门化。对于std::move或std::forward,未授予此类权限。这样做会使您的程序格式不正确,不需要诊断

std::交换您应该只专门化,而不是重载!当默认实现存在效率问题时。默认实现基本上是:

void std::swap( T& lhs, T& rhs ) {
  auto tmp = std::move(lhs);
  lhs = std::move(rhs);
  rhs = std::move(tmp);
}
最常见的情况是类型为空时需要分配内存。更有效的互换可以避免这种分配


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

您认为提供std::move重载会是什么样子?我不认为std::swap是这样,我们是重载它,而不是具体化它。它的专门化应该是loke:namespace std{template void swapFoo&,Foo&;//专门化不重载},如果过度编码它:void swapFoo&,Foo&;毕竟它是一个函数模板,所以它的专门化必须是完全专门化模板关键字,后跟空括号。@ItachiUchiwa用户在命名空间std中编写的重载永远是不合法的。您的程序格式不正确,无需诊断。标准规定了何时可以向namespace std添加专门化,并且此类专门化可能不会违反保证的标准要求,并且添加任何其他内容都会导致程序格式错误,NDR。所以你必须专业化,而不是意外地过载。当然,重载有时会在一些标准库和某些使用中起作用,这使得它非常隐蔽。
void std::swap( T& lhs, T& rhs ) {
  auto tmp = std::move(lhs);
  lhs = std::move(rhs);
  rhs = std::move(tmp);
}