次のようなオブジェクトを宣言すると:
void main()
{
myclass objectA(anotherclass(true,true,0));
}
つまり、後者のコンストラクターを直接呼び出して、objectA と別のオブジェクト「anotherclass」を作成します。「anotherclass」のスコープは何ですか?
main() が終了したときにのみ破棄されますか?
一時的なものは、それを含む完全な式の終わり、つまりコンストラクターの呼び出しがmyclass
戻るときに破棄されます。
C++11 標準のパラグラフ 12.2/3 によると:
一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全な式 (1.9) を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。値の計算と一時オブジェクトの破棄の副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。
このため、のコンストラクターが参照によってmyclass
型の引数(左辺値参照または右辺値参照のいずれか) を受け取る場合、将来の使用のためにそれを格納してはなりません。未定義の動作。anotherClass
const
objectA
関数から戻るときにスコープ外になり、破棄されるのはそれだけですmain()
。
オブジェクトにはanotherclass
スコープがありません。スコープは、オブジェクトではなく名前のプロパティであり、このオブジェクトには名前がありません。これは単なる一時的なオブジェクトであり、完全な式の最後で破棄されます。
スコープの定義は次のとおりです (§3.3.1):
一般に、それぞれの特定の名前は、そのスコープと呼ばれるプログラム テキストの不連続な部分内でのみ有効です。