从函数返回的unique_ptr的范围是什么?

tac*_*che 8 c++ unique-ptr

这会正常吗?(见例)

unique_ptr<A> source()
{
    return unique_ptr<A>(new A);
}


void doSomething(A &a)  
{  
    // ...
}  

void test()  
{  
    doSomething(*source().get());   // unsafe?
    // When does the returned unique_ptr go out of scope?
}
Run Code Online (Sandbox Code Playgroud)

fre*_*low 19

一个unique_ptr从函数返回的没有范围,因为范围只适用于名字.

在您的示例中,临时的生命周期unique_ptr以分号结束.(所以是的,它可以正常工作.)通常,当词汇包含rvalue的完整表达式时,会销毁临时对象,该rvalue的评估创建了临时对象被完全评估.

  • @tache:是的.对于任何返回值都是如此.如果它立即超出范围,从函数返回*任何*将是相当无用的.:) (2认同)
  • 同样的逻辑仍然适用.持有返回值*的临时值*保持在足够长的范围内以供使用,或者它没有价值.正如其他评论者所说,您的代码非常安全 (2认同)

Ala*_*kes 5

临时值在评估“完整表达式”后被破坏,它(大致)是最大的封闭表达式 - 或者在这种情况下是整个语句。所以它是安全的;在 doSomething 返回后,unique_ptr 被销毁。