Remastered enable_if - Flaming Dangerzone http://t.co/Z7VliBgP @SubaruG
2012-06-04 09:33:31template<bool Cond, class T=void> using EnableIf = typename std::enable_if<Cond, T>::type; このように定義された EnableIf を使っていいかは規格の解釈によって違ってくる
2012-06-04 10:13:02具体的には、 Template Alias の展開が immediate context で行われるか否かで変わってくる
2012-06-04 10:13:42@EzoeRyou @cpp_akira template<bool C, class T> struct BadEanableIf : std::enable_if<C, T> {}; は SFINAE に使えないよね、ってことです
2012-06-04 10:15:23@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@SubaruG うーむ、unneduate contextでないとすると、このエイリアステンプレート版enable_ifを、クラステンプレートで使うのは良くて、関数テンプレートで使うのはだめだということに。それは変じゃないか。
2012-06-04 10:20:19@SubaruG @cpp_akira どうしてダメになるのですかね。std::enable_ifのネストされたtypeのsubstituteが失敗すれば、それはmy_enable_ifのネストされたtypeのsubstutituteの失敗になり、つまりimmedi...
2012-06-04 10:22:21@EzoeRyou @cpp_akira クラス内部での置換は immediate context はないからです。 この例は有名だと思ったんですが、もしかしたら間違ってるのかもしれないので、ちょっと調べなおしてみますね
2012-06-04 10:28:35本の虫: インスタンス化による連鎖的なインスタンス化はimmediate contextではない http://t.co/wakVXLnL
2012-06-04 10:47:41@EzoeRyou @cpp_akira そういうことです。 ただ規格では「may be ill-formed」となってるので、 well-formed になる可能性もあって怖いです
2012-06-04 10:52:26@EzoeRyou @cpp_akira コンパイラの実装の微妙な差異によって ill-formed になるか否かが変わるということなので、 SFINAE 周りは完全に定型文になってるもの以外は使わないほうが良いのかな、と思ってます
2012-06-04 10:54:26@SubaruG @cpp_akira SFINAEの挙動は、C++11でだいぶ改善されて、immediate contextでの失敗は全部エラーではないことになったのではないですかね。
2012-06-04 10:57:33@EzoeRyou @cpp_akira すいません適当なこと言いました。 正しくは "can result in the program being ill-formed" でした
2012-06-04 10:58:29@EzoeRyou @cpp_akira その immediate context か否かが微妙なのと、コンパイラによって対応状況が全く異なってくる(毎日のように SFINAE 関連のバグが報告されている)のが問題なのです
2012-06-04 10:59:35@SubaruG @cpp_akira というか、immediate contextによる副作用はエラーになるというのは、どうも理解できない。
2012-06-04 11:00:56