11

これは正しく機能しますか?(例を参照)

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?
}
4

3 に答える 3

21

スコープは名前にのみ適用されるため、関数から返されるunique_ptrスコープにはスコープがありません。

あなたの例では、一時的なものの存続期間はunique_ptrセミコロンで終わります。(そうです、正しく機能します。)一般に、一時オブジェクトは、その評価によって一時オブジェクトが完全に評価された右辺値を字句的に含む完全式が破棄されると破棄されます。

于 2011-05-23T13:24:10.840 に答える
5

一時的な値は、(おおよそ)最大の囲み式である「完全な式」(この場合はステートメント全体)を評価した後に破棄されます。したがって、安全です。doSomethingが戻った後、unique_ptrは破棄されます。

于 2011-05-23T13:26:35.413 に答える
1

大丈夫なはずです。検討

int Func()
{
  int ret = 5;

  return ret;
}

void doSomething(int a) { ... }


doSomething(Func());

スタックにretを返しても、呼び出し元のスコープ内にあるので問題ありません。

于 2011-05-23T13:27:19.280 に答える