C++ 如何正确地从向量返回唯一的_ptr?

C++ 如何正确地从向量返回唯一的_ptr?,c++,c++11,smart-pointers,unique-ptr,C++,C++11,Smart Pointers,Unique Ptr,让代码自己解释一下: class SomeClass { private: std::vector<std::unique_ptr<MyType>> cache; public: std::unique_ptr<MyType> getAt1(int i); MyType* getAt2(int i); } class-SomeClass{ 私人: 向量缓存; 公众: std::唯一的ptr getAt1(int i); MyType*getAt2

让代码自己解释一下:

class SomeClass {
private:
  std::vector<std::unique_ptr<MyType>> cache;
public:
  std::unique_ptr<MyType> getAt1(int i);
  MyType* getAt2(int i);
}
class-SomeClass{
私人:
向量缓存;
公众:
std::唯一的ptr getAt1(int i);
MyType*getAt2(int i);
}
std::unique\u ptr SomeClass::getAt1(inti){
返回std::move(缓存[i]);
}
MyType*SomeClass::getAt2(int i){
返回缓存[i].get();
}
我想知道getAt1是否会使我的向量不一致,或者两种方法都可以。 由于架构缺陷,我真的应该像getAt1一样返回

你怎么看


谢谢。

getAt1的问题是向量中的元素随后为空。我想你应该做的是
getAt2

正如你可能已经知道的,你可以使用共享而不是唯一的ptr。

这:

return std::move(cache[i]);
修改向量内的智能指针。它不再管理
MyType
指针
get()
之后将返回
nullptr
。我认为那不是你想要的

如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:

MyType& SomeClass::getAt1(int i)
{
    return *cache[i];
}
通常的警告在这里适用。如果
cache
中的
unique_ptr
被更改(销毁、重新分配、重置等),则引用可能无效。返回的引用仅用于短期使用

当然,这假定
唯一的\u ptr
永远不是
空ptr
。尚不清楚是否允许
缓存中的
nullptr
值。如果是,则不返回引用。按照
getAt2()
示例,返回一个原始指针。同样的警告仍然适用。如果
unique_ptr
更改,返回的指针将无效

最后,所有这些都假设
SomeClass
cache
MyType
对象的所有者,而
get()
函数只授予对对象的临时、非所有权访问权。如果没有,则应切换到
共享\u ptr
,并返回
共享\u ptr

std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
    return cache[i];
}
std::shared\u ptr SomeClass::getAt1(inti)
{
返回缓存[i];
}

1。它肯定会是nullptr。移动构造函数修改rhs。2.引用是可以的,但是如果指针为null,它是未定义的行为,所以我们在这里必须小心。我建议shared_ptr是一种代码味道。这取决于您想要什么。是否要从向量中删除指针?或者您想要一个指向向量中指针所在对象的指针?向量是否总是比从函数返回的指针寿命长?
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
    return cache[i];
}