2010-06-17

誰が読むんだこれ

規格より、「関数型のrvalue referenceを返す関数の結果は、lvalueである」

そうか。では早速作ってみよう。

void f() {}
using rref_type = void (&&)( void ) ;

rref_type return_rvalue_reference_to_function( void ) 
{
    return static_cast<rref_type>(f) ;
}

たぶん、これが関数型へのrvalue referenceを返す関数である。まてよ、「関数型のrvalue referenceを返す関数の結果は、lvalueである」とすると、std::moveすら、lvalueを返すことになるのだろうか。つまりそれは、

int main()
{
   rref_type ref1 = return_rvalue_reference_to_function() ; // ill-formed.
   rref_type ref2 = std::move(f) ; // ill-formed.

   rref_type ref3 = static_cast<rref_type>(f) ; // OK
}

んー? なぜこんな制限があるのだろう。もう少し考えてみなければ。

追記:見事に解釈が間違っていた。原文は、"A function call is an lvalue if..."となっている。関数呼び出しがlvalueなのであって、関数の結果ではない

これは、通常の関数呼び出しが、関数型へのlvalueか、関数ポインターしか受け付けないということへの対処である。関数型へのrvalueリファレンスであっても、lvalueとして解釈されるということだ。

No comments: