class A;
class B;
func()
{
A x;
B y;
/* some operations */
}
というコードで、スコープ func() を抜けるとき、A,Bのデストラクタが呼ばれる順序は決まっているのでしょうか?
検索したり参考書に当たってみたりしましたが、捜し方が悪いらしく、ずばりの説明が見つかりません。
「定義されていないので、あてにしてはならない」という回答でも、もちろん可です。
http://www002.upp.so-net.ne.jp/ys_oota/effec/chapter3.htm
EffctiveC++����
13項の補足には
・ デストラクタでは、コンストラクタとは逆の順番で呼び出される。
・ このルールにしたがって初期化されるのは、static でないデータメンバーに限られる。
とあります。
http://www.kuzbass.ru/docs/isocpp/stmt.html#stmt.jump
ISO/IEC 14882:1998(E) -- C++ -- Statements
(URLは規格の草案の内容で,現在の正式な規格と若干内容が異なります)
はい.規定されています.質問に挙げられている場合だと,funcのスコープを抜ける際にy, xの順にデストラクタが呼び出されます.
以下,ISO/IEC 14882:2003からの抜粋となります.
6.6 Jump statements
On exit from a scope (however accomplished), destructors (12.4) are called for all constructed objects with automatic storage duration (3.7.2) (named objects or temporaries) that are declared in that scope, in the reverse order of their declaration.
つまり,自動変数は宣言されている順番と逆順で破壊されるということになります.
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FI...
Programming languages - C++ - INCITS/ISO/IEC 14882-2003
厳密な規格を参照する必要がある場合,やはり手元に規格書があるのが最善だと思います.ANSIで売られている規格書は$18と格安なのでお勧めです.もちろん英語が読めることが前提ですが・・・.
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=...
JSA Web Store-メッセージ
JIS規格もあり,こちらはもちろん日本語です.ただし高い.
すばらしい。ずばりの回答ありがとうございます。
そうであろうと予想していた通りでした(そうじゃないと困る使い方をしようとしていたので)。
規格書はやはり持っておくべきでしょうね。引き方が分かっていないと宝の持ち腐れですが。
ありがとうございます。
これはクラスのメンバー変数の初期化順序の話ですね。知りたいのは自動変数の破壊順序です。EffectiveC++ と More EffectiveC++ は一通り読んでいます(読み落しや忘れた内容も多いのですが)。
実際にやってみて結果を見ればよいですが、それが規格で定義された動作なのか、たまたまそうなっているのかは、結局規格に書いてないと分からないのです。
といって、本当に書いていないかどうかは全部読まないと分からないし。