2

次のようなオブジェクトを宣言すると:

void main()
{
    myclass objectA(anotherclass(true,true,0));
}

つまり、後者のコンストラクターを直接呼び出して、objectA と別のオブジェクト「anotherclass」を作成します。「anotherclass」のスコープは何ですか?

main() が終了したときにのみ破棄されますか?

4

2 に答える 2

4

一時的なものは、それを含む完全な式の終わり、つまりコンストラクターの呼び出しがmyclass戻るときに破棄されます。

C++11 標準のパラグラフ 12.2/3 によると:

一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全な式 (1.9) を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。値の計算と一時オブジェクトの破棄の副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。

このため、のコンストラクターが参照によってmyclass型の引数(左辺値参照または右辺値参照のいずれか) を受け取る場合、将来の使用のためにそれを格納してはなりません。未定義の動作。anotherClassconst

objectA関数から戻るときにスコープ外になり、破棄されるのはそれだけですmain()

于 2013-03-22T22:34:18.017 に答える
2

オブジェクトにはanotherclassスコープがありません。スコープは、オブジェクトではなく名前のプロパティであり、このオブジェクトには名前がありません。これは単なる一時的なオブジェクトであり、完全な式の最後で破棄されます。

スコープの定義は次のとおりです (§3.3.1):

一般に、それぞれの特定の名前は、そのスコープと呼ばれるプログラム テキストの不連続な部分内でのみ有効です。

于 2013-03-22T22:34:04.440 に答える