让代码自行解释:
public function udate()
{
$now = new DateTime();
$microseconds = $now->format('u');
list($milliPart, $microPart) = str_split($microseconds, 3);
return $now->format('H:i:s') . ".$milliPart.$microPart";
}
class SomeClass {
private:
std::vector<std::unique_ptr<MyType>> cache;
public:
std::unique_ptr<MyType> getAt1(int i);
MyType* getAt2(int i);
}
我想知道getAt1是否会使我的向量不一致,或者两种方法都可以。 由于架构缺陷,我真的应该像getAt1一样返回。
您对此有何看法?
谢谢。
答案 0 :(得分:2)
此:
return std::move(cache[i]);
修改向量内的智能指针。它不再管理MyType
指针。 get()
之后将返回nullptr
。我认为那不是你想要的。
如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:
MyType& SomeClass::getAt1(int i)
{
return *cache[i];
}
通常的警告在这里适用。如果unique_ptr
中的cache
被更改(销毁,重新分配,重置等),则引用可能无效。返回的引用仅供短期使用。
这当然假定unique_ptr
决不是nullptr
。尚不清楚您是否允许nullptr
中的cache
值。如果是,则不返回参考。按照您的getAt2()
示例,返回原始指针。同样的警告仍然适用。如果unique_ptr
更改,返回的指针将变为无效。
最后,所有这些假设都假设SomeClass
是MyType
中cache
对象的所有者,而get()
函数仅授予临时,非所有者访问权限。对象。如果没有,那么您应该改用shared_ptr
并返回shared_ptr
:
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
return cache[i];
}
答案 1 :(得分:1)
您可能已经知道,可以使用shared_ptr而不是unique_ptr。
答案 2 :(得分:0)
getAt1
的问题在于向量中的元素然后为空。我认为您想改为getAt2
。