2017-09-12 20 views
0

は、次のコード例を考えてみましょう:呼び出し先が返すオブジェクトのスコープ。呼び出し元ローカル変数?

SomeClass Callee() { 
    // Option 1: 
    return SomeClass(/* initializer here */); 

    // Option 2: 
    SomeClass tmp(/* initializer here */); 
    // Do something to tmp here 
    return tmp; 
} 

void Caller() { 
SomeClass a(/* initializer here */); 
SomeClass b = Callee(); 
SomeClass c(/* initializer here */); 
} 

私の知る限り、baよりも長く、上記の例では長いc以上住んでいるが、しません。

Callee()の戻り値がCaller()の変数に割り当てられていないとどうなりますか?上の例で返されたオブジェクトはbのように振舞うでしょうか?または、それはcが作成される前に破壊されますか?私はそれが後者だと思う、確かにしたい。

コード例は次のとおりです。

void Caller() { 
SomeClass a(/* initializer here */); 
Callee(); // what is the scope for the object returned by it? 
SomeClass c(/* initializer here */); 
} 
+0

この質問は不明です。関数には2つのオプションがありますが、後でそれらを参照することはありません。また、私は最後の文を理解していません。私は言い換えられるべき質問を提案する。 – SergeyA

+1

オブジェクトにはスコープがありません。彼らには生涯があります。名前にはスコープがあります。 –

答えて

2

はい、一時的なもののために、cが作成される前であっても破壊されます。ライフタイムは関数呼び出しを含む完全な式です。

[class.temporary]/4

実装は、非自明なコンストラクタがあることクラスの一時オブジェクト導入

([class.ctor]を、[class.copy])、それは ことを保証しなければなりません一時オブジェクトに対してコンストラクタが呼び出されます。 同様に、デストラクタは、 の些細なデストラクタ([class.dtor])で一時的に呼び出されます。 には、作成されたポイントが完全に含まれていることを評価する最後のステップとして、一時オブジェクトが に破壊されています。これは、例外のスローで評価が終了した場合でも、trueです。 一時オブジェクトを破棄する計算と副作用は、完全表現にのみ関連し、特定の サブ表現には関連付けられていません。 です。

関連する問題