Function Scoped Non-Pod 構造は、関数が初めて呼び出されたときに初期化されるという印象を受けました。ただし、VS-2010 では、コンストラクターが例外をスローすると、構築が成功するまで毎回コンストラクターが呼び出されるように見えます。
この動作は実装固有のものですか、それとも標準で保証されているものですか?
以下は、動作を示すために考案された例です。
#include <iostream>
#include <string>
using namespace std;
//dummy resource class
class Resource {
public:
Resource() {
cerr<<"Allocate Resource "<<endl;
}
~Resource() {
cerr<<"Free Resource"<<endl;
}
};
//dummy class which will be statically instantiated
class Dummy {
public:
Dummy() {
cerr<<"in Dummy"<<endl;
throw(string("error"));
}
Resource res;
};
//main program
int main() {
for(int i = 0;i<3;i++) {
try {
//create a static object throw and exception
static Dummy foo;
}
catch ( std::string &e) {
cerr<<"Caught exception:"<<e<<endl<<endl;
}
}
return 1;
}
出力:
反復:0
リソースの割り当て
静的オブジェクト コンストラクター
無料リソース
キャッチされた例外:エラー
反復:1
リソースの割り当て
静的オブジェクト コンストラクター
無料リソース
キャッチされた例外:エラー
反復:2
リソースの割り当て
静的オブジェクト コンストラクター
無料リソース
キャッチされた例外:エラー**