问题描述
我使用过 std::swap
、std::move
和 std::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::move
和std::forward
的版本? -
这是否意味着如果我提供版本,没有任何好处,因为库的更像是证明排序函数,而库的要好得多?
解决方法
只有在标准允许的情况下,您才可以提供 std
函数的特化。没有为 std::move
或 std::forward
授予此类权限。这样做会使您的程序格式错误,无需诊断。
std::swap
你应该只在默认实现有效率问题时专门化(而不是超载!)。默认实现基本上是:
void std::swap( T& lhs,T& rhs ) {
auto tmp = std::move(lhs);
lhs = std::move(rhs);
rhs = std::move(tmp);
}
最常见的情况是您的类型需要在“空”时分配内存。更有效的交换可以避免这种分配。
但对于大多数类型来说,这不是问题。