std::swap个智能指针能保证引用不变吗?
Does std::swap of smart pointers guarantee the references to be unchanged?
智能指针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
可用(尽管如此,它的复制构造函数已被删除)。原始 post 已应用 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() 函数无法更改对象的地址,因为它甚至不知道对象。
如果您正在寻找保证,那么您应该要求保证销毁和 moving/copying 智能指针不会影响对象。
编辑:这与 std::swap(b_ptr, a_ptr);
相关,在 boost 中,智能指针上有一个成员函数交换,因此理论上它可以做任何事情,但我非常怀疑它会改变对象的地址交换指针时。
智能指针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
可用(尽管如此,它的复制构造函数已被删除)。原始 post 已应用 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() 函数无法更改对象的地址,因为它甚至不知道对象。 如果您正在寻找保证,那么您应该要求保证销毁和 moving/copying 智能指针不会影响对象。
编辑:这与 std::swap(b_ptr, a_ptr);
相关,在 boost 中,智能指针上有一个成员函数交换,因此理论上它可以做任何事情,但我非常怀疑它会改变对象的地址交换指针时。