智能指针的 std::swap 是否保证引用保持不变?
Does std::swap of smart pointers guarantee the references to be unchanged?
智能指针的 std::swap 是否保证引用(内存中的地址(保持不变?
std文档指出,让class T
可交换的(几个(合格特征之一是,
分配的,T 必须是可复制和/或移动可构造的
如果交换是通过使用复制构造进行的,我怀疑内存地址可能会更改。但是,我也怀疑在交换特定(智能(指针时,通过复制构造进行交换无关紧要。
下面的代码编译(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 中,智能指针上有一个成员函数交换,所以理论上它可以做任何事情,但我非常怀疑它在交换指针时会改变对象的地址。
相关文章:
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 形成对对象的引用是否构成访问?
- C++ 引用是否在需要时隐式转换为值?
- 右值引用是否具有与右值引用相同的开销?
- 返回引用是否也会延长其生存期?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- 强制转换为指针引用是否会导致未定义的行为
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 结构化绑定和转发引用是否混合良好?
- 此常量引用是否保留了其生命?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 在 C++ 中更改越界指针的取消引用是否安全?
- 本地引用是否由"DetachCurrentThread"清除?
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 常量右值引用是否允许对编译器进行额外优化?
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 返回强制引用是否安全