普通智能指针的.reset方法

问题描述

| 在我看来,boost scoped_ptr和shared_ptr中的reset方法会导致错误的构造和销毁顺序:
boost::scoped_ptr<Component> component(GetDefaultComponent());
component.reset(new BetterComponent); // 1. Creation of the new object
                                      // 2. Destruction of the old object
这是IMO的错误命令。 可以先调用不带参数的reset方法,然后设置新指针。但是,这对我来说似乎是一种解决方法。 (这是一个解决方法”,表示有问题。) 我坚信,提振人非常聪明。因此,对于当前的方法一定有一个理由。 有谁知道更多吗?     

解决方法

        这绝对是正确的顺序。如果ѭ1投掷,会发生什么?哎呀这是所有事物发生的相同顺序,被称为复制和交换,这是最好的处理方式。 尤其是因为您实际上并没有给出当前订单错误的任何原因。     ,        您始终可以在自由函数中重构它(并提防异常安全后果):
template<typename T,typename Pointer,typename... U>
void
emplace_reset(Pointer& pointer,U&&... u)
{
    pointer.reset();
    pointer.reset(new T(std::forward<U>(u)...));
}
// use as: emplace_reset<BetterComponent>(component);
但这不是解决方法,因为reset成员的功能与广告中的相同。您要的是一项新功能。 不提供所需功能(超出异常安全性/事务语义之外)的可能原因是,指针从未创建过它们指向的对象:构造函数假定拥有,仅此而已。
reset
是一致的。