2011-12-30
■[C++]std::common_type の問題点
SFINAE に使えない
メタプログラミングをする上で不便ですね.
必ずしも「引数の型全てが変換される型」を返すとは限らない
struct A { A(int) {} template <class T> A(T) = delete; }; char c = '$'; std::common_type<char, int, A>::type a = c; // エラー,delete されたコンストラクタの呼び出し
std::common_type の特殊化では対応できません (しきれません).
あいまいな特殊化をしている
c++ - Partial specialization of variadic templates - Stack Overflow
14.8.2.5/9 に照らし合わせると,引数2つの特殊化があいまいになってしまいます.
std::common_type<char, int>::type i = c; // エラー,あいまい
規格の defect でしょうか.
Reference を返す場合がある
「や」の字: 【C++11】 decltype, conditional operator, そして common_type
これも defect のような気がしますね.
ではどうすべきか
あんまり使わないのがいいんじゃないでしょうか.
トラックバック - http://d.hatena.ne.jp/iorate/20111230/1325262404
リンク元
- 40 http://atnd.org/events/21936
- 17 http://d.hatena.ne.jp/gintenlabo/20110904/1315140970
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=reference_wrapper&source=web&cd=2&ved=0CCUQFjAB&url=http://d.hatena.ne.jp/iorate/20110416/1302964641&ei=Jtb-TvOKBuvTmAWonJmyDg&usg=AFQjCNFGkkEkA-q_8yfjhcAoLi5ASEnhhA
- 16 http://t.co/w7c0FKZS
- 15 http://partake.in/events/597a0fc3-0e3a-47a3-8fc3-4f32ad846a3d
- 13 http://www.google.co.jp/url?sa=t&rct=j&q=boost move&source=web&cd=2&ved=0CCoQFjAB&url=http://d.hatena.ne.jp/iorate/20110506/1304700716&ei=jZEXT9nkEsXMmAWkteikAw&usg=AFQjCNFq3MlafqNkH9DOA6_ChCdf6wP64w
- 12 http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CC0QFjAB&url=http://d.hatena.ne.jp/iorate/20101231/1293806776&ei=ikYAT-rrO4mViQKz2a2pCA&usg=AFQjCNHXLyBUIiCNYJ7pmfyWnbOdoNe66g&sig2=diKASW6jU2K88TP8g-l5rA
- 11 http://www.google.com/search
- 7 http://d.hatena.ne.jp/
- 7 http://www.google.co.jp/reader/view/?hl=ja&tab=wy