規格より、「関数型の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:
Post a Comment