- 16 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 21:40:28 ]
- >>15
暗黙の変換を避けるため、コンストラクタが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());とすればコンパイルできるが、だめぜったい。
|

|