Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。
編集可能

private: operator void() const;

オペレータオーバーロード怖い、というお話。
17
@yutopp

decltype( hoge, fuga )みたいな書き方ってどういう事なんだろう

2010-07-30 22:46:27
@kikairoya

@yutopp fugaの型を取ると同時に式hogeがvalidであることを確かめている?

2010-07-30 22:48:28
@decimalbloat

@yutopp decltype(operator,(hoge, fuga))もしくはdecltype(hoge.operator,(fuga))か、カンマがオーバーロードされていない場合はdecltype(fuga)と同じです。

2010-07-30 22:49:02
でちまるさん(実際かわいい) @decimalbloat

あー、不親切だなこの説明。 @kikairoya さんの言う通りなのですが、ちゃんとhogeがvalidな式であるか確かめつつfugaの型をとりたい場合はdecltype(static_cast<void>(hoge), fuga)とかしないといけないですね。

2010-07-30 22:54:15
対鉱物用武装 @kikairoya

ああそうかvoidにキャストしないとダメか。でもoperator void()があったら(ry

2010-07-30 22:56:00
対鉱物用武装 @kikairoya

オペランドがvoidでもいいって考えるとoperator ,って異質だなあ

2010-07-30 22:58:49
でちまるさん(実際かわいい) @decimalbloat

@kikairoya あれ?第一オペランドをvoidとするoperator,をオーバーロードできましたっけ?

2010-07-30 23:01:58
対鉱物用武装 @kikairoya

@decimalbloat オーバーロードは無理かなー。組み込み演算子の話。

2010-07-30 23:02:34
でちまるさん(実際かわいい) @decimalbloat

@kikairoya であれば、hogeだけvoidにキャストしておけば、どのオーバーロードされたカンマ演算子も使われないので、(static_cast<void>(hoge), fuga)の型はfugaの型と同じになりますよね。

2010-07-30 23:05:13
対鉱物用武装 @kikairoya

@decimalbloat うん、そんなことができるのが異質だなーと。ほかの演算子は(条件演算子の第2・第3オペランドを除いて)voidを取れないから。

2010-07-30 23:06:23
対鉱物用武装 @kikairoya

しかし偏執的に考えるとoperator void()の存在があるから、該当するoperator ,()が無くても、(hoge, fuga)と(static_cast<void>(hoge), fuga)は同じではないことがある

2010-07-30 23:08:44
対鉱物用武装 @kikairoya

いやまあoperator void()とか誰得だけど

2010-07-30 23:09:10
std::ranges::めるぽん @melponn

operator void() にキャストする際に何か適当に副作用入れておけばいいのか・・・

2010-07-30 23:12:06
対鉱物用武装 @kikairoya

あれ、decltypeのオペランドでもテンプレートの実体化起こるよね?

2010-07-30 23:14:12
対鉱物用武装 @kikairoya

ああいや起こらなくてもprivateとかになってるとアレか。 # それこそ誰得

2010-07-30 23:14:38
std::ranges::めるぽん @melponn

しかし decltype の中だと意味が無いのであった

2010-07-30 23:16:27
でちまるさん(実際かわいい) @decimalbloat

@kikairoya decltype(hoge, fuga)やそこに static_cast入れたとしても、decltypeで調べたいことには何ら影響ないかと。

2010-07-30 23:16:46
対鉱物用武装 @kikairoya

んー、偏執狂対策するには複文式無いと無理な気がしてきた

2010-07-30 23:16:47
対鉱物用武装 @kikairoya

@decimalbloat private: operator void() const; という可能性は関係ない?

2010-07-30 23:17:52
std::ranges::めるぽん @melponn

private: operator void() とかかっこよすぎる・・・

2010-07-30 23:17:58
std::ranges::めるぽん @melponn

http://ideone.com/fpcFW private にするとちゃんとエラーになた・・・

2010-07-30 23:18:45
でちまるさん(実際かわいい) @decimalbloat

hogeがvalidな式であることを調べつつfugaの型を取得するのが目的なら、operator voidがprivateで宣言されていない限りは大丈夫…

2010-07-30 23:19:04
残りを読む(39)

コメント

Egtra (ysk-noh) @egtra 2010年7月31日
ふと思った、operator void() = delete;している場合もまずい気がする。
0