这会正常吗? (见例)
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?
}
答案 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());
即使你在堆栈上返回它也没关系,因为它在调用范围内。