904. result_of argument types

Section: 99 [func.ret] Status: C++11 Submitter: Jonathan Wakely Opened: 2008-09-10 Last modified: 2016-02-10

Priority: Not Prioritized

View all other issues in [func.ret].

View all issues with C++11 status.

Discussion:

The WP and TR1 have the same text regarding the argument types of a result_of expression:

The values ti are lvalues when the corresponding type Ti is a reference type, and rvalues otherwise.

I read this to mean that this compiles:

typedef int (*func)(int&);
result_of<func(int&&)>::type i = 0;

even though this doesn't:

int f(int&);
f( std::move(0) );

Should the text be updated to say "when Ti is an lvalue-reference type" or am I missing something?

I later came up with this self-contained example which won't compile, but I think it should:

struct X {
  void operator()(int&);
  int operator()(int&&);
} x;

std::result_of< X(int&&) >::type i = x(std::move(0));

[ Post Summit: ]

Recommend Tentatively Ready.

Proposed resolution:

Change 99 [func.ret], p1:

... The values ti are lvalues when the corresponding type Ti is an lvalue-reference type, and rvalues otherwise.