Is a closure type a structural type?
Section [expr.prim.lambda.closure]
Zhihao Yuan

Created on 2022-03-01.00:00:00 last changed 2 months ago


Date: 2023-03-31.21:45:01

Proposed resolution (approved by CWG 2023-03-30):

Change in [expr.prim.lambda.closure] paragraph 2 as follows:

... The closure type is not an aggregate type (9.4.2 [dcl.init.aggr]) and not a structural type (13.2 [temp.param]). ...
Date: 2023-06-15.00:00:00

[Accepted as a DR at the June, 2023 meeting.]


  template <auto V>
  void foo() {}

  void bar() {
    foo<[i = 3] { return i; }>();

It is unclear whether the data members of a closure type are public or private. This makes a difference, since it affects whether a closure type is a structural type or not (13.2 [temp.param] paragraph 7:

A structural type is one of the following:
  • a scalar type, or
  • an lvalue reference type, or
  • a literal class type with the following properties:
    • all base classes and non-static data members are public and non-mutable and
    • the types of all bases classes and non-static data members are structural types or (possibly multi-dimensional) array thereof.
Date User Action Args
2023-07-16 13:00:43adminsetstatus: ready -> dr
2023-03-31 21:45:01adminsetmessages: + msg7242
2023-03-31 21:45:01adminsetstatus: drafting -> ready
2022-11-20 07:54:16adminsetstatus: open -> drafting
2022-03-01 00:00:00admincreate