如果我有T a
和T b
并且我调用std::swap(a, b)
,那么调用的复制构造函数,赋值运算符和析构函数的顺序是什么?
答案 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
某些类型(例如容器)可能具有交换内部指针等的特化,没有临时对象和对象分配。