(2023/03/30更新)TwitterAPI有償化に関する最新報告はこちら。有償化後も可能な限り対応予定です。
2011年2月15日

boost::optional<T&>の話

コンストラクタで取る変数の受け取り方について、から始まって、 std::unique_ptr<T>&→T&→(T*)→boost::optional<T&>→boost::optional<T&>の改良版実装 etude::optional_ref<T> というような流れで話は進んでます。 続きを読む
11
@rshhh

const std::unique_ptr& を引数に取るコンストラクタとか別に問題ないよね?std::shared_ptrにした方がいい?

2011-02-14 22:50:37
普通のC++使い、銀天すばる @SubaruG

T& にするべきじゃないですかね。 RT @rshhh: const std::unique_ptr& を引数に取るコンストラクタとか別に問題ないよね?std::shared_ptrにした方がいい?

2011-02-14 22:52:31
普通のC++使い、銀天すばる @SubaruG

無効参照を取り得るなら T* でもいいね。

2011-02-14 22:52:51
普通のC++使い、銀天すばる @SubaruG

const std::unique_ptr<T>& って、所有権以上出来ないんだから生ポインタと何ら変わらない。

2011-02-14 22:53:37
普通のC++使い、銀天すばる @SubaruG

だったら型の制約が遥かに緩い生ポインタなり、もっというなら参照を使うべき。

2011-02-14 22:54:05
普通のC++使い、銀天すばる @SubaruG

生ポインタは資源を所有させない場合には普通に便利に使えるんだよにゃー。

2011-02-14 22:58:40
普通のC++使い、銀天すばる @SubaruG

まぁ boost::optional<T&> が(生ポインタと同じ効率で)使えるなら、それに越したことはないけど。

2011-02-14 22:59:07
@rshhh

@SubaruG 語弊がありました。セットしてやりたい情報を他のオブジェクト経由でHogeのコンストラクタに渡してやりたい場合に、Hoge::Hoge(const std::unique_ptr& param) みたいに書いても問題ないよね、ってことが知りたかったのです。、

2011-02-14 23:01:49
普通のC++使い、銀天すばる @SubaruG

@rshhh 書くだけなら問題ないです。もちろん所有権移譲は一切できないですけどね。

2011-02-14 23:03:12
@rshhh

基本的に所有権ごにょごにょする必要性がないならstd::unique_ptrでいいんだよね? MP3のID3タグをいじるライブラリがClangだから、それが生成するオブジェクトをC++のスマポで管理したいんだけど。

2011-02-14 23:03:41
普通のC++使い、銀天すばる @SubaruG

@rshhh 誰かが所有権を管理してるオブジェクトを横から眺めたい動機だとしたら std::unique_ptr はよくないです。汎用性的な意味で。

2011-02-14 23:05:08
普通のC++使い、銀天すばる @SubaruG

@rshhh もし shared_ptr で管理してるオブジェクトを横から眺めたくなったらどうすればいいですかね。

2011-02-14 23:05:26
普通のC++使い、銀天すばる @SubaruG

何かを参照したいときは素直に参照使えって話ですわ。

2011-02-14 23:06:39
普通のC++使い、銀天すばる @SubaruG

const std::unique_ptr<T>& 型の引数を取る、ってのは、呼び出し元が std::unique_ptr<T, std::default_delete<T>> で資源を管理してることを要求する、ってこと。例えば資源管理方法が変わったらその時点で使えなくなる。

2011-02-14 23:08:25
普通のC++使い、銀天すばる @SubaruG

勿論 std::shared_ptr<T> で管理してたらアウトだし、 default_delete 以外の unique_ptr でもアウト。そういう意図で使うなら別に構わないけど、資源管理方法を強制したい状況って、そうそう無いです。

2011-02-14 23:09:48
@rshhh

@SubaruG それが気になったので、ちょっと調べましたー。std::shared_ptrには、std::unique_ptrを取るコンストラクタが用意されてるようなので、こういう、何が渡されるか定まらない状況ではそれを使うべきなんでしょうか。

2011-02-14 23:52:28
@rshhh

@SubaruG ですよねぇ・・・。となると、所有権の移譲が必要になる状況下でないなら、http://twitter.com/#!/SubaruG/status/37150424444178435 これの解決策はどうなるんでしょうか。

2011-02-14 23:56:11
普通のC++使い、銀天すばる @SubaruG

@rshhh 何らかの理由で無効値が必要なら、生ポインタを使えばいい。全てのスマートポインタは参照なり生ポインタの取得を行えますからね。

2011-02-14 23:57:27
@rshhh

@SubaruG あれw 最初のreplyで指摘して頂いていたことですよね。読み違えてました・・・。なるほどなるほど。

2011-02-15 00:00:52
@rshhh

@SubaruG なるほど。でも、生ポインタを取るようなコンストラクタを定義すると、RAIIのためのコンストラクタだと読み取られたりしませんか?そこら辺は、引数の変数名とか、文脈から読み取ってもらえばいいんでしょうか。

2011-02-15 00:02:53
普通のC++使い、銀天すばる @SubaruG

@rshhh 明示的に参照であることを表明したいなら、 boost::optional<T&> というのもあります。ただし今のところポインタのほうが効率的ですが。

2011-02-15 00:03:55
普通のC++使い、銀天すばる @SubaruG

生ポインタを廃絶出来ればいい、ってのは、みんな思ってる。だから標準ライブラリに Boost.Optional を入れるべきだった。

2011-02-15 00:08:50
おすすめオリジナル動画