#include <functional>
void foo(int){}
int main(){
// assume 'std::function' uses 'ArgTypes&&...' in 'operator()'
std::function<void(int)> f(foo);
// 'f's 'operator()' will be instantiated as
// 'void operator()(int&&)'
// which will only accept rvalues
int i = 5;
f(i); // error
f(5); // OK, '5' is an rvalue
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cgp2b2lkIGZvbyhpbnQpe30KCmludCBtYWluKCl7CiAgLy8gYXNzdW1lICdzdGQ6OmZ1bmN0aW9uJyB1c2VzICdBcmdUeXBlcyYmLi4uJyBpbiAnb3BlcmF0b3IoKScKICBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZihmb28pOwogIC8vICdmJ3MgJ29wZXJhdG9yKCknIHdpbGwgYmUgaW5zdGFudGlhdGVkIGFzCiAgLy8gJ3ZvaWQgb3BlcmF0b3IoKShpbnQmJiknCiAgLy8gd2hpY2ggd2lsbCBvbmx5IGFjY2VwdCBydmFsdWVzCiAgaW50IGkgPSA1OwogIGYoaSk7IC8vIGVycm9yCiAgZig1KTsgLy8gT0ssICc1JyBpcyBhbiBydmFsdWUKfQ==