This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-11-11
[Moved to DR status at the April, 2013 meeting as part of paper N3638.]
There does not appear to be any technical difficulty that would require the current restriction that the return type of a lambda can be deduced only if the body of the lambda consists of a single return statement. In particular, multiple return statements could be permitted if they all return the same type.
Proposed resolution (August, 2011):
Change 7.5.6 [expr.prim.lambda] paragraph 4 as follows:
...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-seqopt return expression ;
the type of the returned expression after lvalue-to-rvalue conversion (7.3.2 [conv.lval]), array-to-pointer conversion (7.3.3 [conv.array]), and function-to-pointer conversion (7.3.4 [conv.func]);
otherwise, void.if there are no return statements in the compound-statement, or all return statements return either an expression of type void or no expression or braced-init-list, the type void;
otherwise, if all return statements return an expression and the types of the returned expressions after lvalue-to-rvalue conversion (7.3.2 [conv.lval]), array-to-pointer conversion (7.3.3 [conv.array]), and function-to-pointer conversion (7.3.4 [conv.func]) are the same, that common type;
otherwise, the program is ill-formed.
[Example:
auto x1 = [](int i){ return i; }; // OK: return type is int auto x2 = []{ return { 1, 2 }; }; // error: the return type is void (a // braced-init-list is not an expression) struct A { int fn1(); const int& fn2(); }; template <class T> void f () { [](T t, bool b){ if (b) return t.fn1(); else return t.fn2(); }; } template void f<A>(); // OK: lambda return type is int—end example]
Additional note (February, 2012):
EWG requested that the adoption of this proposed resolution be postponed to allow them to discuss it. The issue has thus been returned to "review" status pending EWG action.