Title
Restrictions on return type deduction for lambdas
Status
cd3
Section
7.5.5 [expr.prim.lambda]
Submitter
Jason Merrill

Created on 2009-09-04.00:00:00 last changed 123 months ago

Messages

Date: 2013-04-15.00:00:00

[Moved to DR status at the April, 2013 meeting as part of paper N3638.]

Date: 2012-02-15.00:00:00

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.

Date: 2011-08-15.00:00:00

Proposed resolution (August, 2011):

Change 7.5.5 [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]

Date: 2010-08-23.00:00:00
N3092 comment US 30

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.

History
Date User Action Args
2014-03-03 00:00:00adminsetstatus: drwp -> cd3
2013-10-14 00:00:00adminsetstatus: dr -> drwp
2013-05-03 00:00:00adminsetmessages: + msg4379
2013-05-03 00:00:00adminsetstatus: review -> dr
2012-02-27 00:00:00adminsetmessages: + msg3749
2012-02-27 00:00:00adminsetstatus: ready -> review
2011-09-06 00:00:00adminsetmessages: + msg3430
2011-09-06 00:00:00adminsetstatus: open -> ready
2009-09-04 00:00:00admincreate