OptionalかわいいよOptional

4
前へ 1 2 3 ・・ 6 次へ
普通のC++使い、銀天すばる @SubaruG

日本語のメーリスにすら投げた事ないのに、いきなり英語の、しかもBoostのメーリスに投げるとか怖すぎるんですが

2010-06-03 04:16:09
普通のC++使い、銀天すばる @SubaruG

ってーか optional<T&> のデストラクタが trivial でないとか意外すぎるのですが><

2010-06-03 04:18:42
普通のC++使い、銀天すばる @SubaruG

うわ。Boost.Optional 終わりすぎ。 optional<T&> って T* と同じもんじゃん。なんでサイズ違うんだ>< http://ideone.com/PIEfo

2010-06-03 04:20:36
普通のC++使い、銀天すばる @SubaruG

sizeof( boost::optional<T&> ) が sizeof( T* ) と一致しない件について、ブログに文句を追記した。これは本気で爆発すべき動作。

2010-06-03 04:30:28
だし巻き卵 @mashiro

boost.optionalのサイズが変わっちゃうのは初期化されてるかの状態持ってるからどうしようもないような気もする。

2010-06-03 04:41:56
普通のC++使い、銀天すばる @SubaruG

@YurineMashiro T& に関しては、内部状態として T* を持てばいいので、同じサイズで実現可能と言うか、実現して欲しかったです。

2010-06-03 04:43:11
普通のC++使い、銀天すばる @SubaruG

@YurineMashiro そもそも T& の「サイズ」って何よ、という話にもなりますし。

2010-06-03 04:43:41
だし巻き卵 @mashiro

@SubaruG なるほど、確かにそうですね。そうなるとT&がoptionalに入れられちゃうのもちょっと気持ち悪いような気もします。

2010-06-03 04:45:01
普通のC++使い、銀天すばる @SubaruG

言うまでもないことだけど、 boost::optional<T&> は、代入の構文以外は生ポインタそのものなのですよ。

2010-06-03 04:45:13
普通のC++使い、銀天すばる @SubaruG

@YurineMashiro それに関しては公式でもかなり細かく触れられてますね。

2010-06-03 04:46:18
普通のC++使い、銀天すばる @SubaruG

@YurineMashiro 是非はともかく、optional<T&> は、再設定可能で NULL にもなれる参照、という、ポインタよりも狭い概念を示すのに便利なので、僕は割と積極的に使ってました。

2010-06-03 04:47:18
普通のC++使い、銀天すばる @SubaruG

所謂 ”rebind" をすることができる参照型ってのは、 T* と reference_wrapper<T> と optional<T&> が代表的ですが

2010-06-03 04:49:07
普通のC++使い、銀天すばる @SubaruG

T* は歴史的に参照以外の役割(最たる例はランダムアクセスイテレータ)も持っている、 reference_wrapper は無効参照を取れない、という弱点が有るので、 optional<T&> はかなり有効な選択肢。

2010-06-03 04:50:05
普通のC++使い、銀天すばる @SubaruG

というか、意図の把握しづらい生ポインタを駆逐するために、あえて生ポインタと殆ど同じ構文で使える生ポインタの代替として作られたって言う側面もある、と僕は勝手に推測してるわけで。

2010-06-03 04:52:24
普通のC++使い、銀天すばる @SubaruG

optional<T&> が生ポインタと同じサイズじゃないってのは、ありえんですわー。

2010-06-03 04:52:49
普通のC++使い、銀天すばる @SubaruG

そうそう、直接は関係ないけど、 boost::optional<T> は、一般の T に対して「 "rebind" できる T 」という側面も有ったりするんですよ。

2010-06-03 04:56:04
普通のC++使い、銀天すばる @SubaruG

つまり、代入演算に頼らず、コンストラクタによって中身を書き換えられる、ということ。 optional<T const> は、初期化と "rebind" 以外の一切の変更を禁止するクラスとして有効。

2010-06-03 04:57:00
だし巻き卵 @mashiro

@SubaruG 参照ってくくりに捕らわれずに考えたら便利そうな気がしてきました。

2010-06-03 04:57:17
普通のC++使い、銀天すばる @SubaruG

かつ、 "rebind" できるクラス、というものを、例外安全にジェネリックに書いた場合、 Boost.Optional と同じものが出来上がります。

2010-06-03 04:57:27
普通のC++使い、銀天すばる @SubaruG

これは要するに、 "rebind" する際、再度コンストラクタが呼ばれる時に例外が投げられた場合、

2010-06-03 04:58:52
普通のC++使い、銀天すばる @SubaruG

どうやっても無効状態になる可能性が出てきてしまうので、有効/無効のフラグは絶対に必要になる。

2010-06-03 04:59:24
普通のC++使い、銀天すばる @SubaruG

コンストラクタで例外の投げられる可能性が有るクラスを、準手動でメモリ管理する場合、殆どが Boost.Optional に帰結します。

2010-06-03 05:01:17
普通のC++使い、銀天すばる @SubaruG

無論、ジェネリックじゃなければ、もっと効率的な実装方法は存在します。

2010-06-03 05:02:30
普通のC++使い、銀天すばる @SubaruG

Boost.Optional の凄い点は、格納する型に対する制約が殆ど存在しない点ですからにゃー。

2010-06-03 05:03:12
普通のC++使い、銀天すばる @SubaruG

スタック上に置けるオブジェクトであれば、正になんでもおk。デストラクタで例外を投げると未定義だってのは常識だし。

2010-06-03 05:05:36
前へ 1 2 3 ・・ 6 次へ