SFINAE & immediate context

すふぃ姉様の直接文脈.
1
普通のC++使い、銀天すばる @SubaruG

@cpp_akira この Template Alias を使った方法って規格的に微妙な気がします

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

template<bool Cond, class T=void> using EnableIf = typename std::enable_if<Cond, T>::type; このように定義された EnableIf を使っていいかは規格の解釈によって違ってくる

2012-06-04 10:13:02
普通のC++使い、銀天すばる @SubaruG

具体的には、 Template Alias の展開が immediate context で行われるか否かで変わってくる

2012-06-04 10:13:42
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira template<bool C, class T> struct BadEanableIf : std::enable_if<C, T> {}; は SFINAE に使えないよね、ってことです

2012-06-04 10:15:23
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira ダメなのは template<bool C, class T> struct my_enable_if { typedef typename std::enable_if<C, T>::type type; }; でした

2012-06-04 10:20:10
江添亮 @EzoeRyou

@SubaruG うーむ、unneduate contextでないとすると、このエイリアステンプレート版enable_ifを、クラステンプレートで使うのは良くて、関数テンプレートで使うのはだめだということに。それは変じゃないか。

2012-06-04 10:20:19
江添亮 @EzoeRyou

@SubaruG @cpp_akira どうしてダメになるのですかね。std::enable_ifのネストされたtypeのsubstituteが失敗すれば、それはmy_enable_ifのネストされたtypeのsubstutituteの失敗になり、つまりimmedi...

2012-06-04 10:22:21
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira クラス内部での置換は immediate context はないからです。 この例は有名だと思ったんですが、もしかしたら間違ってるのかもしれないので、ちょっと調べなおしてみますね

2012-06-04 10:28:35
江添亮 @EzoeRyou

うへぇ、これは面倒だな。

2012-06-04 10:34:05
江添亮 @EzoeRyou

うわー、これは面倒だな。

2012-06-04 10:36:59
江添亮 @EzoeRyou

本の虫: インスタンス化による連鎖的なインスタンス化はimmediate contextではない http://t.co/wakVXLnL

2012-06-04 10:47:41
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira そういうことです。 ただ規格では「may be ill-formed」となってるので、 well-formed になる可能性もあって怖いです

2012-06-04 10:52:26
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira コンパイラの実装の微妙な差異によって ill-formed になるか否かが変わるということなので、 SFINAE 周りは完全に定型文になってるもの以外は使わないほうが良いのかな、と思ってます

2012-06-04 10:54:26
江添亮 @EzoeRyou

@SubaruG @cpp_akira え、"may be ill-formed"、どこに書いてあるのですか?

2012-06-04 10:55:38
江添亮 @EzoeRyou

@SubaruG @cpp_akira SFINAEの挙動は、C++11でだいぶ改善されて、immediate contextでの失敗は全部エラーではないことになったのではないですかね。

2012-06-04 10:57:33
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira すいません適当なこと言いました。 正しくは "can result in the program being ill-formed" でした

2012-06-04 10:58:29
普通のC++使い、銀天すばる @SubaruG

@EzoeRyou @cpp_akira その immediate context か否かが微妙なのと、コンパイラによって対応状況が全く異なってくる(毎日のように SFINAE 関連のバグが報告されている)のが問題なのです

2012-06-04 10:59:35
江添亮 @EzoeRyou

@SubaruG @cpp_akira というか、immediate contextによる副作用はエラーになるというのは、どうも理解できない。

2012-06-04 11:00:56
江添亮 @EzoeRyou

なんで? 別にいいじゃん、エラーじゃなくて。

2012-06-04 11:01:11