【初心者歓迎】C/C++室 Ver.66【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0016デフォルトの名無しさん
2009/05/28(木) 21:40:28暗黙の変換を避けるため、コンストラクタがexplicitになっている。
こんなとき
void f(scoped_ptr<hoge> const&, int);
int g();
f(new f, g());の評価順序は決まっていないのだが、
もしnew hoge→g呼出→scoped_ptr一時オブジェクト生成→f呼出の順だったら、
g()が例外を投げると、new hogeに対するdeleteが呼ばれなくなる。
そこでf(new f, g());がエラーになるようexplicitが使われている。
=で初期化できなくなる弊害より安全性が優先されたということ。
なお、f(scoped_ptr<hoge>(new f), g());とすればコンパイルできるが、だめぜったい。
■ このスレッドは過去ログ倉庫に格納されています