人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++の規格において、自動変数として使われたクラスのデストラクタ呼び出し順序は規定されているのでしょうか?
class A;
class B;
func()
{
A x;
B y;
/* some operations */
}
というコードで、スコープ func() を抜けるとき、A,Bのデストラクタが呼ばれる順序は決まっているのでしょうか?
検索したり参考書に当たってみたりしましたが、捜し方が悪いらしく、ずばりの説明が見つかりません。
「定義されていないので、あてにしてはならない」という回答でも、もちろん可です。

●質問者: takomasa
●カテゴリ:コンピュータ
✍キーワード:C++ Class クタ クラス コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● sorlag
●10ポイント

http://www002.upp.so-net.ne.jp/ys_oota/effec/chapter3.htm

EffctiveC++????

13項の補足には

・ デストラクタでは、コンストラクタとは逆の順番で呼び出される。

・ このルールにしたがって初期化されるのは、static でないデータメンバーに限られる。

とあります。

◎質問者からの返答

ありがとうございます。

これはクラスのメンバー変数の初期化順序の話ですね。知りたいのは自動変数の破壊順序です。EffectiveC++ と More EffectiveC++ は一通り読んでいます(読み落しや忘れた内容も多いのですが)。

実際にやってみて結果を見ればよいですが、それが規格で定義された動作なのか、たまたまそうなっているのかは、結局規格に書いてないと分からないのです。

といって、本当に書いていないかどうかは全部読まないと分からないし。


2 ● Cryolite
●100ポイント

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規格もあり,こちらはもちろん日本語です.ただし高い.

◎質問者からの返答

すばらしい。ずばりの回答ありがとうございます。

そうであろうと予想していた通りでした(そうじゃないと困る使い方をしようとしていたので)。

規格書はやはり持っておくべきでしょうね。引き方が分かっていないと宝の持ち腐れですが。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ