std::declvalまとめ

昨日の夜(正確には今日の0時〜2時頃)までにすばるさんから頂いたコメント&すばるさんに検証中にアドバイスをもらったこと等をメモしておきます。私としてはここはそういう書き溜めにする予定。

class T
{
public:
      class U{};
      U get_u();//ココ
};

void hoge(T t)
{
     decltype(t.get_u()) foo;
}

のget_uの部分(実装)を無くして標準ライブラリを用いて実装することが可能となった。

decltype(std::declval<T::U>()) foo; //実際には参照も外す記述がいる

という書き方でできるようになりました。いろいろ利点や注意する点はあるのですが、それはすばるさんの記事が詳しいと思うのでメモ用にもリンクを貼っておきます。簡潔に言っておくとstd::declval()で手に入る型は T::U&& と右辺値参照が手に入るということでしょうか。

decltype(t)::Uに関しては以前も書いたように、C++0xとしてはできるようにする予定で今後コンパイラのほうで対応してもらうしかないようですね。

ちなみにincludeするのはで、gccでは対応、VS2010では未対応でした...