C++11 访问向量中的对象T<;独特的_ptr<;T>&燃气轮机;没有所有权

C++11 访问向量中的对象T<;独特的_ptr<;T>&燃气轮机;没有所有权,c++11,vector,unique-ptr,C++11,Vector,Unique Ptr,我在一个类中有以下成员变量: std::向量对象 我明确希望向量始终保持所有权。我看到一些建议,为了让成员函数访问向量中的指针,并对std::unique_ptr中包装的对象T进行更改,我们必须将指针移动到调用代码,即: void foo(int i) { auto object = std::move( vector.at( i ) ); // move object to caller (caller owns) object->dosomet

我在一个类中有以下成员变量:
std::向量对象

我明确希望向量始终保持所有权。我看到一些建议,为了让成员函数访问向量中的指针,并对
std::unique_ptr
中包装的对象
T
进行更改,我们必须将指针移动到调用代码,即:

    void foo(int i) {
        auto object = std::move( vector.at( i ) );  // move object to caller (caller owns)
        object->dosomething(); 
        vector.at(i) = std::move(object); // move back into vector (vector owns)
    }
另一种方法是使用原始指针:

    void foo(int i) {
        Object* object = vector.at( i ).get();
        object->doSomething();
    }
然而,我一直在处理这个问题:

    void foo(int i) {
        auto& object = vector.at( i );
        object->doSomething();
    }
对于我的案例,哪种方法是正确且最可靠的?此函数是否拥有
std::unique\u ptr
中的数据所有权?有没有一种方法可以访问
对象
,而不用玩
std::unique_ptr


(如果我的方法不正确,请原谅,我希望我能理解这一点)

如果
object->dosomething()
抛出异常(即它不是异常安全的),第一种方法将不会保留对象的所有权,因为第二条
std::move()
语句将不会执行

假设C++11,其他两种方法实际上是等效的,前提是所拥有的指针不为null。在相同的假设下,代码可以简化为

void foo(int i)
{
    vector.at(i)->doSomething();
}
<>这将适用于所有C++标准(不仅仅是C++ 11或更高版本)。 可以访问对象而无需使用
unique\u ptr
-只需将指针存储在其他位置并使用它即可。但是,这确实损害了首先使用
std::unique_ptr
的目的。并且容易出错-例如,
std::unique\u ptr
可以破坏对象,并使其他指针悬空


<>如果你真的担心你的矢量失去所有权的可能性,那就考虑使用<代码> SydDypPTR <代码>。< /P> doh!当然,简化是有效的!很明显,我已经盯着这个看太久了。