• ベストアンサー

デフォルトコンストラクタが呼ばれる条件について。

VC8のプロジェクトをVC9に移行させていたのですが、 少し気になることがあります。以下のコードはVC8ではちゃんと RAII と表示されていました。 #include <stdio.h> class RAII { public:  RAII(){puts("RAIII");}  ~RAII(){} }; int main() {  RAII raii(); /*RAII()が呼ばれない?*/ } しかし、VC9を入れた直後から上のコードでは引数なしコンストラクタ が呼ばれなくなりました(同時にVC8のアップデートも行ったため そちらのせいかもしれませんが)。 最初は「RAII raii();」という形式は自分の記憶違いか何かだと 思っていましたが、移行後に動かなくなった自作のライブラリ を見てみると、このような宣言形式を用いていました。 もちろん「RAII raii;」と端折るだけで問題は解決するのですが、 何か気持ちが悪いです。 これは一体何が起こったのでしょうか?仕様が変わったのでしょうか? ご存知の方、ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2
qatatatfds
質問者

お礼

返答ありがとうございます。 あ、確かに警告がででますね。 気が付きませんでした。 つまり、VC側の解析力不足でプロトタイプ宣言に見えるように なってしまった。本来ならば、ちゃんと宣言されて、 コンストラクタが呼ばれるハズ ということでいいのですか? 一昨日VCをアップデートさせる前はこんなのがなかったような 気がしたのですが。。。。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

規格によれば, これは「プロトタイプ宣言とみなす」のが正解です. より正確にいうと, 初期化子として中に何もない単独の () を付けることはでき ず, 従って RAII raii(); という文は文法上プロトタイプ宣言としか解釈できません. ISO C では 8.5.8 あたり. Java だとこれでデフォルトコンストラクタを呼び出すんですけどね.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

コンパイラが警告を出していませんか?

関連するQ&A