X / _ / X < "むぅぶせまんちくす!";

あああああぁぁぁぁぁもおおおおおちょおおおおお気に入らねえええええぇぇぇぇぇ!!!!!
以下のコードは GCC 4.3.0 以降で -std=c++0x オプションを指定しないとコンパイルが通りません.

#include <string>
#include <iostream>

template<typename T> struct lr_impl{ static int const value = -1; };
template<typename T> struct lr_impl<T&>{ static int const value = 1; };

template<typename L, typename R>
int lr(){ return (lr_impl<L>::value + lr_impl<R>::value) / 2; }

template<typename T>
struct plain{ typedef T type; };

template<typename T>
struct plain<T&>{ typedef T type; };

template<typename T>
struct plain<T&&>{ typedef T type; };

template<typename T> T &&fwd(T &&x){ return x; }

char const *str[] = {"ひだまり", "スケッチ", "365"};

struct X_{
  std::string str_;
  X_(char const *p = "") : str_(p) {}
  X_(X_ &&x) : str_() { str_.swap(x.str_); }
  ~X_(){ std::cout << str_; }
} X, _;

template<typename L, typename R>
X_ impl(L &&, R &&)
{ return X_(str[1 + lr<L, R>()]); }

template<typename L, typename R>
X_ operator/(L &&l, R &&r)
{ return impl(fwd<L>(l), fwd<R>(r)); }

template<typename T>
X_ operator<(T &&l, X_ &&r)
{ return impl(fwd<T>(l), fwd<X_>(r)); }

int main()
{
  X / _ / X < "来週も見てくださいね!";
}

#(・3・) アルェー GCC のこのテンポラリの破壊順序って変じゃNE?