boost::optional<T&>の話

T& にするべきじゃないですかね。 RT @rshhh: const std::unique_ptr& を引数に取るコンストラクタとか別に問題ないよね?std::shared_ptrにした方がいい?
2011-02-14 22:52:31
const std::unique_ptr<T>& って、所有権以上出来ないんだから生ポインタと何ら変わらない。
2011-02-14 22:53:37
まぁ boost::optional<T&> が(生ポインタと同じ効率で)使えるなら、それに越したことはないけど。
2011-02-14 22:59:07
@SubaruG 語弊がありました。セットしてやりたい情報を他のオブジェクト経由でHogeのコンストラクタに渡してやりたい場合に、Hoge::Hoge(const std::unique_ptr& param) みたいに書いても問題ないよね、ってことが知りたかったのです。、
2011-02-14 23:01:49
基本的に所有権ごにょごにょする必要性がないならstd::unique_ptrでいいんだよね? MP3のID3タグをいじるライブラリがClangだから、それが生成するオブジェクトをC++のスマポで管理したいんだけど。
2011-02-14 23:03:41
@rshhh 誰かが所有権を管理してるオブジェクトを横から眺めたい動機だとしたら std::unique_ptr はよくないです。汎用性的な意味で。
2011-02-14 23:05:08
@rshhh もし shared_ptr で管理してるオブジェクトを横から眺めたくなったらどうすればいいですかね。
2011-02-14 23:05:26
const std::unique_ptr<T>& 型の引数を取る、ってのは、呼び出し元が std::unique_ptr<T, std::default_delete<T>> で資源を管理してることを要求する、ってこと。例えば資源管理方法が変わったらその時点で使えなくなる。
2011-02-14 23:08:25
勿論 std::shared_ptr<T> で管理してたらアウトだし、 default_delete 以外の unique_ptr でもアウト。そういう意図で使うなら別に構わないけど、資源管理方法を強制したい状況って、そうそう無いです。
2011-02-14 23:09:48
@SubaruG それが気になったので、ちょっと調べましたー。std::shared_ptrには、std::unique_ptrを取るコンストラクタが用意されてるようなので、こういう、何が渡されるか定まらない状況ではそれを使うべきなんでしょうか。
2011-02-14 23:52:28
@SubaruG ですよねぇ・・・。となると、所有権の移譲が必要になる状況下でないなら、http://twitter.com/#!/SubaruG/status/37150424444178435 これの解決策はどうなるんでしょうか。
2011-02-14 23:56:11
@rshhh 何らかの理由で無効値が必要なら、生ポインタを使えばいい。全てのスマートポインタは参照なり生ポインタの取得を行えますからね。
2011-02-14 23:57:27
@SubaruG なるほど。でも、生ポインタを取るようなコンストラクタを定義すると、RAIIのためのコンストラクタだと読み取られたりしませんか?そこら辺は、引数の変数名とか、文脈から読み取ってもらえばいいんでしょうか。
2011-02-15 00:02:53
@rshhh 明示的に参照であることを表明したいなら、 boost::optional<T&> というのもあります。ただし今のところポインタのほうが効率的ですが。
2011-02-15 00:03:55
生ポインタを廃絶出来ればいい、ってのは、みんな思ってる。だから標準ライブラリに Boost.Optional を入れるべきだった。
2011-02-15 00:08:50