It seems, that in your example trailing-return-type cannot be omitted. Here is excerpt from standard (5.1.2 Lambda expressions):
If a lambda-expression does not include a trailing-return-type, it is as if the trailing-return-type denotes the following type: — if the compound-statement is of the form { attribute-specifier-seq return expression ; } the type of the returned expression after lvalue-to-rvalue conversion (4.1), array-to-pointer conversion (4.2), and function-to-pointer conversion (4.3); — otherwise, void.
Returned value in your example cannot be used for conversions mentioned above. Following code with explicitely added return type compiles in VS 2010:
auto adder = [] (int x) -> std::function {
return [=]( int y ) {
return x + y;
};
};