c++ 为模板定义的参数调用swap的标准方法是什么?

fhity93d  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(174)

调用swap()的标准方法是什么?
显然调用std::swap()是不正确的,因为它不会拾取在与类型相同的命名空间中声明的交换。插入using namespace std;似乎是不正确的,因为它会导致错误。应该插入using std::swap;吗?

3ks5zfa0

3ks5zfa01#

"swappable types"的标准要求是swap(t, u),其中来自<utility>标头的std::swap是可行的候选项。
using namespace std;和if都可以满足这一点,标准的方法是后者(https://wg21.link/swappable.requirements#6):

#include <utility>

// Preconditions: std​::​forward<T>(t) is swappable with std​::​forward<U>(u).
template<class T, class U>
void value_swap(T&& t, U&& u) {
  using std::swap;
  swap(std::forward<T>(t), std::forward<U>(u)); // OK, uses “swappable with'' conditions
                                                // for rvalues and lvalues
}

// Preconditions: lvalues of T are swappable.
template<class T>
void lv_swap(T& t1, T& t2) {
  using std::swap;
  swap(t1, t2);                                 // OK, uses swappable conditions for lvalues of type T
}

要交换两个相同类型的左值,也可以使用std::iter_swap(std::addressof(a), std::adddressof(b))。这不需要using声明。
另请参阅:std::is_swappable
这与C++20的swappable概念是分开的,后者使用std::ranges::swap,尽管这可能是您想要使用的。

相关问题