std :: swap如何在构造函数,赋值运算符和析构函数方面工作?

时间:2014-08-27 14:06:51

标签: c++ std swap

如果我有T aT b并且我调用std::swap(a, b),那么调用的复制构造函数,赋值运算符和析构函数的顺序是什么?

2 个答案:

答案 0 :(得分:4)

没有特定的顺序"强制使用",这完全取决于所使用的标准库提供的实现。

std::swap的C ++ 03变体将是:

template<typename T>
void swap(T& a, T& b) {
    T temp(a); // copy
    a = b;     // assign
    b = temp;  // assign
}

C ++ 11实现将是:

template<typename T>
void swap(T& a, T& b) {
    T temp = std::move(a); // move copy or normal copy (moves if moveable)
    a = std::move(b);      // move or assign
    b = std::move(temp);   // move or assign
}

多个std容器等专注于swap,因为它们可以提供更好或更有效的实现;自定义类型也可以这样做。在这些专业化中,可能会或将会发生更多变化。

答案 1 :(得分:3)

如果T没有专业化,那么通用版本将按照

的方式执行某些操作
{
    T t = std::move(a);  // move construction
    a = std::move(b);    // move assignment
    b = std::move(t);    // move assignment
}                        // destruction of t

某些类型(例如容器)可能具有交换内部指针等的特化,没有临时对象和对象分配。