規格より、「関数型の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
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.