c++ - 智能指针的 std::swap 是否保证引用不变?

标签 c++ boost swap

智能指针的std::swap能否保证引用(内存中的地址)不变?

std 文档指出,让 class T 可交换的(几个)限定特征之一是,

T must be assignable and T must be copy and/or move constructible

如果通过使用复制构造进行交换,我怀疑内存地址可能会改变。但是,我还怀疑在交换特定(智能)指针时,通过复制构造进行交换并不相关。

下面的代码可以编译(GCC)并顺利运行,而不会在交换时更改地址,但我能保证这样吗?

注意:示例使用std::auto_ptr,因为评论中指出std代码优于boost。我使用旧的 C++,并且没有可用的 std::unique_ptr (尽管如此,它的复制构造函数已被删除)。原始帖子应用了 boost::scoped_ptr

#include <boost/scoped_ptr>
#include <iostream>

class Awesome
{
public:
    Awesome(int a=0) : Value(a) {}
    Awesome(const Awesome& T) : Value(T.Value) {}
    int Value;
};

int main()
{
    std::auto_ptr<Awesome> a_ptr(new Awesome(2));
    Awesome& a_ref = *a_ptr.get();

    std::cout << "a_ptr's addr : " << a_ptr.get() << std::endl;
    std::cout << "a_ref's addr : " << &a_ref << std::endl;

    std::auto_ptr<Awesome> b_ptr;
    std::swap(b_ptr, a_ptr); // <<------------------ Does this (possibly) break 'a_ref' ?

    std::cout << "b_ptr's addr : "<< b_ptr.get() << std::endl;

    return 0;
}

最佳答案

您正在交换指针,而不是对象本身,swap() 函数无法更改对象的地址,因为它甚至不知道对象。 如果您正在寻求保证,那么您应该要求保证销毁和移动/复制智能指针不会影响对象。

编辑:这与 std::swap(b_ptr, a_ptr); 相关,在boost中,智能指针上有一个成员函数swap,所以理论上它可以做任何事情,但我非常怀疑它在交换指针时会改变对象的地址。

关于c++ - 智能指针的 std::swap 是否保证引用不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588039/

相关文章:

c++ - 等效于 OpenCV C++ 接口(interface)中的 cvSetImageROI

c++ - boost::locale 和 std::locale 之间的权衡是什么?

c++ - Boost.Regex 分隔符解析

c++ - 如何在 boost HTML3 示例中向服务器发送 SIGTERM 或 SIGINT 信号?

Java-如何交换2个数组元素并使用toString输出shell排序的每个交换?

c - 是否可以仅使用 += 和 -= 而不使用其他运算符或变量来交换两个变量?

c++ - gcc安装在/usr/local以外时的默认头路径

c++ - 双向解引用迭代器的返回类型

c++ - 无法生成完整的静态链接应用程序

php - 如何用数组中的值交换键?