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

时间:2011-05-23 13:20:50

标签: 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?
}

3 个答案:

答案 0 :(得分:19)

从函数返回的unique_ptr没有范围,因为范围仅适用于名称。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

应该没问题。考虑

int Func()
{
  int ret = 5;

  return ret;
}

void doSomething(int a) { ... }


doSomething(Func());

即使你在堆栈上返回它也没关系,因为它在调用范围内。