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

标签 c++ std swap

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

最佳答案

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

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,因为它们可以提供更好或更高效的实现;自定义类型可以做同样的事情。在这些特化中,可能或将会发生更多的变化。

关于c++ - std::swap 在构造函数、赋值运算符和析构函数方面如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529334/

相关文章:

c++ - std::string 内存泄漏

c++ - 字节交换方面的一般交换实现

c++ - 对重载赋值运算符的结果是否为左值感到困惑

c++ - fprintf stdout 没有 100% 准确地转储数据

c++ - 如何处理大数?

2 列表元素的 Pythonic 交换

linux - 如何使 linux swap 更急切?

C++ 模板 - 在元组及其类型的容器上进行模板化

c++ - 二维 vector C++ 中的多于两列排序

c++ - Vim 转到 std 库方法/函数定义