C++の規格において、自動変数として使われたクラスのデストラクタ呼び出し順序は規定されているのでしょうか?

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:sorlag No.1

回答回数26ベストアンサー獲得回数0

ポイント10pt

13項の補足には

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

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

とあります。

id:takomasa

ありがとうございます。

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

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

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

2005/07/20 11:30:34
id:Cryolite No.2

回答回数4ベストアンサー獲得回数0

ポイント100pt

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と格安なのでお勧めです.もちろん英語が読めることが前提ですが・・・.

JIS規格もあり,こちらはもちろん日本語です.ただし高い.

id:takomasa

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

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

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

2005/07/21 00:29:35

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません