The following compiles and runs (under Apple LLVM version 6.1.0 and Visual C++ 2015):
#include <functional>
#include <iostream>
struct s { int x; };
int main(int argc, char **argv)
{
std::function<void (s &&)> f = [](const s &p) { std::cout << p.x; };
f(s {1});
return 0;
}
Why doesn't the assignment std::function<void (s &&)> f = [](const s &p) { std::cout << p.x; };
generate an error? A function accepting an rvalue reference should not have the same signature as a function accepting a const lvalue reference, should it? Dropping the const
from the lambda's declaration does generate an error as expected.