ゆとりーなの日記

日記的な事を書いて行くと思はれる

パイプオペレータのあれこれ

すばる先生の素敵なパイプオペレータの実装例を見たのですが、これがVC++2010だとことごとくコンパイルエラーですよ。はい。
取り敢えずすばる先生の原版http://ideone.com/pHQazはこんな感じなのですが、わざわざVCの為に関数テンプレートのデフォルトテンプレート引数を取っ払ってくれたのにも関わらずこけます。

fatal error C1004: 予期せぬ EOF が検出されました。

よりにもよって予期せぬEOFです。意味不明です。
取り敢えずいじりにいじってこうすればVCでも通るようになるみたいです。

#include <type_traits>
#include <utility>
 
namespace pipe_operator {
template<class T, class F>
auto operator |(T &&x, F &&f) -> decltype(std::forward<F>(f)(std::forward<T>(x))) {
  return std::forward<F>(f)(std::forward<T>(x));
} 
}
 
#include <iostream>
 
int main() {
  using pipe_operator::operator|;
  1 | []( int x ) { // 赤線出るけどコンパイルは通るし実行結果は1。
    std::cout << x << std::endl;
  };
  return 0;
};

gccだとauto使うとADLが使えなくなる疑惑があるらしいのですがVCではどうなんでしょうか。もしこけるのなら割と詰んでしまいますね。
追記:使えなくなるのはADLではなくSFINAEらしいです。
更に追記:原版でこけるのはmsvc10のstd::declvalが未実装だからみたいです。