decltypeとresult_ofの違い

comp.std.c++ - C++0x: result_of and decltype


関数の戻り値の型は、decltype(f(args))とstd::result_of::typeという2つの方法で取得できるけど、
これらに違いはあるのだろうか。両方必要なのだろうか。と、Scott Meyersから質問が出てました。


decltypeとresult_ofの違いは、decltypeは式に適用し、result_ofは型に適用するということ。
result_ofは関数のシグニチャ(FとArgsは型)を要求し、
decltypeは有効な式(f=関数/関数ポインタ/参照/関数オブジェクト、args=オブジェクト)を要求します。


また、std::Callableコンセプトがあればstd::Callable::result_typeで関数(オブジェクト)の
戻り値の型を取得できるのでresult_ofは不要に思えますが、std::Callableはoperator()を要求するのに対し、
result_ofは戻り値の型を要求するので、result_ofはoperator()を持たない関数オブジェクトにも適用できます。