2024-03 Tokyo ISO C++ Committee Trip Report — Third C++26 meeting! 🗼
This week was the C++ Committee meeting, in Tokyo, 🇯🇵 Japan 🇯🇵 in which we got a lot of new C++26 features! There were 210 attendees, with a mix of "virtual" and in-person attendance.
The features voted on will be added gradually to the working draft, and will likely be officially released on the next version (C++26), barring any subsequent changes.
This was the first time since 2000 that we met in Tokyo. We were excited to have local members of the committee (Japan’s ITSCJ) involved in this meeting. We are in Tokyo during 🌸 hanami 🌸 season. We were also fortunate to feel a significant earthquake during the meeting! Our gracious hosts, Woven by Toyota held a meetup on Reflection in their office, the video will be posted on their YouTube channel.
Main C++26 Features approved in Tokyo: 🎉
- P3201R0: LEWG [[nodiscard]] policy
- P0609R3: Attributes for Structured Bindings
- P2809R3: Trivial infinite loops are not Undefined Behavior
- P2795R5: Erroneous behaviour for uninitialized reads
- P3032R1: Less transient constexpr allocation
- P2573R2:
= delete("should have a reason");
- P2893R3: Variadic
friends
- P3142R0: Printing Blank Lines with
println
- P2845R8: Formatting of
std::filesystem::path
- P0493R5: Atomic minimum/maximum
- P2542R8:
views::concat
- P2591R5: Concatenation of strings and string views
- P2248R8: Enabling list-initialization for algorithms
- P2810R4:
is_debugger_present
is_replaceable
- P1068R11: Vector API for random number generation
- P2944R3: Comparisons for
reference_wrapper
- P2642R6: Padded
mdspan
layouts
Language Progress
Evolution Working Group (EWG) Progress
Language Evolution met for the entire week, prioritizing big features that are attempting to make their way to C++26:
An entire day was spent discussing Reflection. P2996R2: Reflection for C++26 — ♻ feedback provided, very positive response, making good progress towards C++26. (Daveed’s slides.)
An entire day was spent discussing Contracts. P2900R6: Contracts for C++ — ♻ significant feedback was given to the group, though the polls show a significantly divided Committee which might have difficulty reaching consensus. Timur's slides. P3173R0 — P2900R6 may be minimal, but it is not viable — a set of sustained objection from Microsoft were provided and discussed.
A half day was spent discussing Pattern Matching. P2688R1: Pattern Matching: match Expression — ♻ an update was provided on the design, and feedback was given to the authors, an updated implementation will be needed soon if we want to have pattern matching in C++26.
These 3 features are the culmination of many years of work from dedicated committee members, and EWG spent significant effort trying to provide actionable feedback to help get the features ready, we hope for C++26.
Unlike in recent meetings, EWG was not able to see all papers scheduled. We will therefore be resuming bi-weekly telecons.
Bug fixes
We reviewed 7 issues.
- CWG2843: Undated reference to Unicode makes C++ a moving target (We agreed to specify a specific version of the Unicode standard)
- CWG2836: Conversion rank of long double and extended floating-point types (We decided to keep the deviation between C and C+)
- CWG2819: Cast from null pointer value in a constant expression (We decided to support conversions from void* to a pointer-to-object type also when the original pointer is a null pointer value)
- CWG2565: Invalid types in the parameter-declaration-clause of a requires-expression (We want to see a paper)
- CWG2804: Lookup for determining rewrite targets (We want to see a paper)
- CWG2797: Meaning of "corresponds" for rewritten operator candidates (No consensus for change)
- CWG2776: Substitution failure and implementation limits (We want to see a paper)
- CWG2784: Unclear definition of member-designator for
offsetof
(We want to see a paper)paper needed - CWG2726: Alternative tokens appearing as attribute-tokens (We want to see a paper)
- CWG1699: Does befriending a class befriend its friends?(We want to see a paper)
- CWG2669: Lifetime extension for aggregate initialization (We want to see a paper)
P3031R0: Resolve "CWG2561: conversion function for lambda with explicit object parameter" (move forward with proposed option 1)
Papers forwarded to CWG
We forwarded 7 papers to CWG.
- P3034R0: Module Declarations Shouldn’t be Macros — ✅ Forward P3034R0 to CWG for inclusion in C++ as a DR against C++20.
- P2786R3: Trivial Relocatability For C++26 — ✅ progressing through CWG, disallow
trivially_relocatable(�)
on unnamed struct/class/union. An issue remains to be resolved regarding a new vexing parse in code such asstruct C trivially_relocatable (bool(my_constexpr_value)) { };
- P2573R1:
= delete("should have a reason");
— ✅ forward to CWG for inclusion in C++26 - P2963R1: Ordering of constraints involving fold expressions — ✅ forward to CWG for inclusion in C++26
- P2686R2: constexpr structured bindings and references to constexpr variables — ✅ progressing through CWG, but require implementation experience before moving to plenary
- P3032R0: Less transient constexpr allocation — ✅ Forward to CWG as DR for C++20
- P0562R1: Initialization List Symmetry — ✅ also add support for base class trailing commas, and send to CWG for inclusion in C++26.
- P2841R2: Concept Template Parameters — ✅ send to CWG for inclusion in C++26
Papers sent back to EWG from CWG
CWG sent us 6 papers back, as they do.
- P2809R3: Trivial infinite loops — validate the removal of
yield_forever
- P2747R1: constexpr placement new — array support? currently not supported by
construct_at
; see LWG issue - P0609R2: Attributes for structured bindings — also adjust range-for-declaration
- D2795R5: Erroneous behaviour for uninitialized reads — EWG agrees that EB may create values which later trigger UB, for example an EB read of a pointer has a defined value but dereferencing the pointer may then be UB.
- P2893R2: variadic friends —
friend T1, T2;
is now supported, and the template expansion of friend expands to this new syntax. - D1061R8: Structured Bindings can introduce a Pack — disallow the feature in namespace scope, send back to CWG
Papers that received feedback
9 papers received feedback and will be coming back.
- P3068R0: Allowing exception throwing in constant-evaluation — ♻ feedback provided, needs implementation experience
- P2481R2: Forwarding reference to specific type/template — ♻ feedback provided
- P2826R2 — Replacement functions — ♻ feedback provided
- P3074R2:
std::uninitialized
— ♻ feedback provided - P2758R2: Emitting messages at compile time — ♻ feedback provided
- P2994R1: On the Naming of Packs — ♻ feedback provided
- P3115R0: Data Member, Variable and Alias Declarations Can Introduce A Pack — ♻ encourage more work
- P2414R1: Pointer lifetime-end zap proposed solutions — ♻ encourage more work
- P2806R2:
do
expressions — ♻ encourage more work
Papers which did not proceed
2 papers did not have consensus to proceed.
- P3110R0 — Array element initialization via pattern expansion — ❌ not interested to proceed with the paper as-is
- P2355R2 — Postfix fold expressions — ❌ not interested to proceed with the paper as-is
Papers we didn’t have time to see
5 papers didn’t have sufficient time to be seen.
- P2992R1: Attribute
[[discard]]
and attributes on expressions - P2989R0: A Simple Approach to Universal Template Parameters
- P0963R1: Structured binding declaration as a condition
- P0876R14:
fiber_context
- fibers without scheduler - P3006R0: Launder less
Papers without presenters available
4 papers came in without presenters identified.
- P1203R0: modular
main()
- P2607R0: Let alignas specify minimum alignment
- P2191R0: Modules: ADL & GMFs do not play together well (anymore)
- P1046R2: Automatically Generate More Operators
Core Working Group
Core had a productive week, with 47 core issues and 9 papers ready for plenary.
There’s a need to highlight "Erroneous behaviour for uninitialized reads", which removes undefined behavior for some cases of uninitialized objects.
Paper P2747R2 "constexpr placement new" did not make it onto today's straw polls and will be delayed to St. Louis.
There is no significant backlog for paper review in CWG.
Core intends to hold teleconferences every two weeks between now and St. Louis.
C++26 is near, and large papers such as pattern matching, contracts, and reflection seem to be on the horizon, competing for last-minute CWG review bandwidth. We should be prepared to make tough choices here, unless at least one of those papers arrives in CWG soon.
Evolution Working Group Incubator Study Group (SG17) Progress
Papers
EWGI (SG17) met an entire day and saw 8 papers, 6 of which were forwarded to EWG with extensive feedback:
- P3087R0: Make direct-initialization for enumeration types at least as permissive as direct-list-initialization
- P3140R0: std::int_least_128_t
- P2034R3: Partially Mutable Lambda Captures
- P2822R0: Providing user control of associated entities of class types
- P2830R2: Standardized Type Ordering
- P2825R1: declcall(unevaluated-postfix-expression)
Library Progress
Library Evolution Working Group (LEWG) Progress
Library Evolution Work Group continues to hold weekly telecons in order to handle the workload in between in-person WG21 meetings.
The Tokyo meeting has brought together a lot of our experienced attendees. This was very beneficial for reviewing a lot of fixes, and giving valuable feedback to large features.
LEWG had it’s first policies discussion during Tokyo meeting. Policies were created to guide authors of standard library proposals, and by doing so, improve the process and save both the group and the authors’ time.
Information about policies can be found in:
"P2267: Library Evolution Policies" (The rationale and process of setting a policy for the Standard Library)
On Tuesday morning, LEWG conducted a combined session with EWG on the topic of "Reflection". We saw a first introduction to the paper: "P2996R2: Reflection for C++26", and brought up concerns and issues that may occur and need to be considered, both from the standard library's perspective (implicit guarantees which may be implied between versions) and from reflection-based libraries' perspective in general (e.g "P3096R0: Function Parameter Reflection in Reflection for C++26"). We will follow up on these topics (and any others that may occur) in both telecons and future meetings, with the aim of having P2996 ready for delivery in C++26.
Features approved
Forwarded (directly)
- P3107R5: Permit an efficient implementation of std::print (Bug fix, support by implementers)
- P2845R6: Formatting of std::filesystem::path (Minor fix)
- LWG3918 std::uninitialized_move/_n and guaranteed copy elision
Forwarded (pending an Electronic Poll)
- P2855R1: Member customization points for Senders and Receivers (P2300 Improvement)
- P2019R5: Thread attributes
- P2927R1: Observing exceptions stored in exception_ptr
- P2997R0: Removing the common reference requirement from the indirectly invocable concepts
- P3168R0: Give std::optional Range Support
- P2075R4: Philox as an extension of the C++ RNG engines
- P2835R3: Expose std::atomic_ref's object address
- P3016R2: Resolve inconsistencies in begin/end for valarray and braced initializer lists
Features Reviewed
Progress on Large Features
- P2996R3: Reflection for C++26 (Joint EWG/LEWG session)
- P2900R6: Contracts for C++
- P3149R2: async_scope -- Creating scopes for non-sequential concurrency (addition to P2300R7)
- P2643R2: Improving C++ concurrency features
- P1708R8: Basic Statistics
Other Library Features Reviewed
- P2988R3: std::optional<T&>
- P3091R0: Better lookups for
map
andunordered_map
- P2946R1: A flexible solution to the problems of
noexcept
- P2721R0: Deprecating function
- P3166R0: Static Exception Specifications
- P1255R12: A view of 0 or 1 elements: views::maybe
Not supported or needs-revision
- P3022R0: A Boring Thread Attributes Interface
- P3147R0: A Direction for Vector
- P3160R0: An allocator-aware
inplace_vector
Library Evolution Policies Progress
Policies approved (pending an electronic poll)
Approved: - P3201R0: LEWG [[nodiscard]] policy
Discussion included: - P3162R0: LEWG [[nodiscard]] policy - P3122R0: [[nodiscard]] should be Recommended Practice - P2422R0: Remove nodiscard annotations from the standard library specification
Policies Requires Additional Discussion
- P2946R1: A flexible solution to the problems of
noexcept
- P2837R0: Planning to Revisit the Lakos Rule
- P3085R0:
noexcept
policy for SD-9 (throws nothing) - P3155R0: noexcept policy for SD-9 (The Lakos Rule)
We will continue our weekly telecons until St. Louis. There, we plan to hold an evening session on one (or few) of the following “P3045R0: Quantities and units library”, “P1708R8: Basic Statistics”, P2786R4: Trivial Relocatability For C++26”, “P0260R5: C++ Concurrent Queues” (or possibly other major features).
Library Evolution Working Group Incubator Study Group (SG18) Progress
LEWGI met twice during the week.
We reviewed five papers:
P3105 constexpr std::uncaught_exceptions(), which will be forwarded to LEWG
P3086 Proxy: A Pointer-Semantics-Based Polymorphism Library, needs a revision, but expects to be forwarded to LEWG next time
P3104 Bit permutations, needs a revision, but expects to be forwarded to LEWG next time
P3094 std::basic_fixed_string, needs a revision, but expects to be forwarded to LEWG next time
P3045 Quantities and units library, in progress
Library Working Group (LWG) Progress
After weekly telecoms leading up to the meeting, LWG spent one quarter of the meeting on P2300. We achieved the milestone of completing a first pass through the entire paper! We will continue to work in telecom and are now mildly optimistic of completing P2300 in St. Louis.
In addition to P2300 we worked almost exclusively on other papers - notably completing padded mdspan layouts and making significant progress on fiber_context, indirect and polymorphic. We also assisted Core in completing the Erroneous behavior paper.
Approved
- P2248R8: Enabling list-initialization for algorithms
- P2875R4: Undeprecate polymorphic_allocator::destroy for C++26
- P2867R5: Remove Deprecated strstreams From C++26
- P2591R5: Concatenation of strings and string_views
Additional Papers Reviewed
- P0876RX: fiber_context - fibers without scheduler
Study Group Progress
Concurrency and Parallelism Study Group (SG1) Progress
SG1 met most of the week.
We’re starting to see new post-P2300 content. Close to half of the minuted discussions. It’s an exciting time, setting precedents for a large portion of new SG1 features to come!
Remote participation worked well this time again, despite the hardships for remote participants given the time difference. Thanks to them for their sacrifices, and as always would love to see them in person. :)
Papers
- P3149R0: async_scope -- Creating scopes for non-sequential concurrency
- P3300R0: C++ Asynchronous Parallel Algorithms
- P3179R0: C++ parallel range algorithms
- P3159R0: C++ Range Adaptors and Parallel Algorithms
- P3135R0: Hazard Pointer Extensions
- P2414R2: Pointer lifetime-end zap proposed solutions
- D3181R0 — Atomic stores and object lifetimes
- D3125R0 — Pointer tagging
- CWG2298: Actions and expression evaluation
- LWG3941: atomics.order inadvertently prohibits widespread implementation techniques
- LWG4004: The load and store operation in atomics.order p1 is ambiguous
- A miscompilation bug in LICMPass (concurrency)
- P2964R0: Allowing user-defined types in std::simd
- P3138R0: views::cache_last
- P260R8: C++ Concurrent Queues
- Late discussion of removing detached launch from P2300
- Late discussion of the case for ensure_started in P2300
Networking (SG4) Progress
We met on Friday afternoon, and discussed P3185R0: A proposed direction for C++ Standard Networking based on IETF_TAPS.
We encouraged further exploration in that direction, as it will help us generically wrap networking stacks provided by operating systems in sender-receiver compatible APIs.
We also decided that providing generic abstractions of low-level networking primitives is not a priority, but ensure we provide enough generic sender-receiver facilities to make it easy.
Thomas Rodgers promised to come back with more exploration on what the API for TAPS might look like.
Dietmar Kühl did not have an update on his work on the networking stack, but is busy making it actually work.
Numerics Study Group (SG6) Progress
Numerics Study Group (SG6) Progress
SG6 met on Tuesday and Friday. We reviewed the following papers.
Papers
- P3008R1: Atomic floating-point min/max
- P2746R4: Deprecate and Replace Fenv Rounding Modes
- P3045R0: Quantities and units library
- P2964R0: Allowing user-defined types in std::simd
- P2993R0: Constrained Numbers
Compile-time Programming Study Group (SG7) Progress
The Reflection study group met on Friday morning.
The group reviewed four papers (much additional reflection work was reviewed on Tuesday morning in a joint EWG/LEWG session discussing P2996).
Papers
- P3095R0: ABI comparison with reflection
Saksham Sharma presented techniques using facilities from P2996R2 to collect characteristics from data structures to ensure consistency between communication peers. The group discussed the possibility of standardizing facilities for this purpose.
- P3096R0: Function Parameter Reflection in Reflection for C++26
Walter Genovese argued in favor of re-integrating parameter reflection facilities from P1240 (Scalable Reflection in C++) into the reflection feature set aimed at C++26. The group agreed to pursue this through a paper evolving along P2996.
- P3037R0: constexpr std::shared_ptr
Paul Keir presented a slight revision of his proposal (P3037R1) to allow using std::shared_ptr during constant evaluation. The group approved forwarding that proposal to EWG as written.
- P3157R0: Generative Extensions for Reflection
Andrei Alexandrescu walked SG7 through his vision of what it would take in addition to P2996 to make reflection truly useful for various advanced tasks. It is expected that details of some of those capabilities — along with initial implementation experience — will be developed for the next WG21 meeting (St. Louis, June 2024).
Ranges Study Group (SG9) Progress
SG9 met on Tuesday and Wednesday, and saw the following papers and issues.
Papers
- P3137R0: views::to_input
- P3138R0: views::cache_last
- P3059R0: Making user-defined constructors of view iterators/sentinels private
- P3136R0: Retiring niebloids
- P3052R1: view_interface::at()
- P3156R0: empty_checkable_range
- P3117R0: Extending Conditionally Borrowed
- P3060R1: Add std::views::up to(n)
- P3179R0: C++ parallel range algorithms
- P1729R0: Text Parsing
Issues and minor updates
- LWG3971: Join ranges of rvalue references with ranges of prvalues
- P2022R3: Rangified version of lexicographical_compare_three_way
SG9 will hold a telecon before St. Louis, to go over the papers which were not seen during the meeting.
Low Latency Study Group (SG14) Progress
SG14 did not meet during the Tokyo meeting. They will continue their monthly telecons.
Tooling Study Group (SG15) Progress
The Tooling Study Group met for 1 and a half days this week and saw 7 papers. We decided to pursue adding structured response files and a new build database in the same vein as compilation databases but with support for modules to the Ecosystem IS.
We also saw several papers on implementation details of modules and provided some guidance to implementers and plan to meet with the itanium ABI group.
We took a look at the reflection proposal to discuss some tooling concerns related to how users can debug the reification features in the proposal.
Lastly we had a good discussion on libraries/package management/build systems and what we can do to improve the dependency management problem.
Text and Unicode Study Group (SG16) Progress
SG16 did not meet this week but continues to meet remotely twice monthly to review and forward papers. The following papers are ones that were adopted into C++26 this week that SG16 previously contributed to.
Contracts Study Group (SG21) Progress
SG21 (Contracts) report:
Leading up to the Tokyo meeting, SG21 had ten telecons, during which we completed P2900R6 (the Contracts MVP paper) and polled to forward it to EWG and LEWG. The paper was seen by both groups in Tokyo (LEWG on Monday, EWG on Wednesday) and we received plenty of feedback from both groups as well as vendor feedback from clang.
SG21 was sitting on Thursday afternoon and Friday afternoon in Tokyo. On Thursday afternoon, we were processing this feedback:
D3198R0 "Tokyo LEWG feedback on Contracts MVP" (Andrzej Krzemieński) P3191R0 "Feedback on the scalability of contract violations handlers in P2900" (Louis Dionne, Yeoul Na, Konstantin Varlamov)
We addressed most of LEWG's feedback and incorporated the new contract evaluation semantic proposed in P3191R0, addressing the vendor feedback from clang.
On Friday we had a joint session with SG23 (Safety & Security) to discuss the safety concerns about P2900R6 that have been brought up in EWG this week. As a result of this session, we decided that the directional paper P2680R1 "Contracts for C++: Prioritizing Safety" (which was previously considered, but not adopted, by SG21) should be seen by SG23. We request guidance from SG23 on whether we should reconsider the direction proposed by P2680R1 for the Contracts MVP.
SG21 will continue to have regular telecons post Tokyo. The priorities for those telecons will be first to finish processing EWG and LEWG feedback on P2900R6, and then to get consensus on a solution for supporting contract assertions on virtual functions.
C / C++ Liaison Group (SG22) Progress
Liaison group did not meet during this meeting.
Safety & Security Group (SG23) Progress
SG23 met on Monday and looked at P3052R1 "view_interface::at()" We polled in favour of making progress on this paper, but do not need to see it again in SG23.
The SG23 work group had a shared session with the SG21 contracts group to talk about UB in contracts. There will be further telecons to discuss UB in contracts.
Papers
- P3052R1: "view_interface::at()"
C++ Release Schedule
NOTE: This is a plan not a promise. Treat it as speculative and tentative.
See P1000, P0592, P2000 for the latest plan.
Meeting | Location | Objective |
---|---|---|
2024 Winter Meeting | Japan 🇯🇵 | Design major C++26 features. |
2024 Summer Meeting | St. Louis 🇺🇸 | Design major C++26 features. |
2024 Fall Meeting | Wrocław 🇵🇱 | C++26 major language feature freeze. |
2025 Winter Meeting | Hagenberg 🇦🇹 | C++26 feature freeze. C++26 design is feature-complete. |
2025 Summer Meeting | Sofia 🇧🇬 | Complete C++26 CD wording. Start C++26 CD balloting ("beta testing"). |
2025 Fall Meeting | Kona 🇺🇸 | C++26 CD ballot comment resolution ("bug fixes"). |
2026 Winter Meeting | 🗺️ | C++26 CD ballot comment resolution ("bug fixes"), C++26 completed. |
2026 Summer Meeting | 🗺️ | First meeting of C++29. |
Status of Major C++ Feature Development
NOTE: This is a plan not a promise. Treat it as speculative and tentative.
IS = International Standard. The C++ programming language. C++11, C++14, C++17, C++20, C+23, etc.
TS = Technical Specification. "Feature branches" available on some but not all implementations. Coroutines TS v1, Modules TS v1, etc.
CD = Committee Draft. A draft of an IS/TS that is sent out to national standards bodies for review and feedback ("beta testing").
Updates since the last Reddit trip report are in bold.
Feature | Status | Depends On | Current Target (Conservative Estimate) | Current Target (Optimistic Estimate) |
---|---|---|---|---|
Senders | Processed by LWG | C++26 | C++26 | |
Networking | Require rebase on Senders | Senders | C++29 | C++26 |
Linear Algebra | Plenary approved | C++26 | C++26 | |
SIMD | Forwarded to LWG | C++26 | C++26 | |
Contracts | Processed on Study Group SG21 | C++29 | C++26 | |
Reflection | Forwarded to EWG | C++26 | C++26 | |
Pattern Matching | P2688R1 Presented in EWG | C++29 | C++26 |
Last Meeting's Reddit Trip Report.
If you have any questions, ask them in this thread!
Report issues by replying to the top-level stickied comment for issue reporting.
/u/InbalL, Library Evolution (LEWG) Chair, Israeli National Body Chair
/u/jfbastien, Evolution (EWG) Chair
/u/ErichKeane, Evolution (EWG) Vice Chair, Evolution Incubator (SG17) Chair
/u/c0r3ntin, Library Evolution (LEWG) Vice Chair
/u/FabioFracassi, Library Evolution (LEWG) Vice Chair
/u/nliber, Library Evolution Incubator (LEWGI / SG18) Vice Chair, US National Body Vice Chair, Admin Chair
/u/je4d, Networking (SG4) Chair
/u/gasperazman, Networking (SG4) Vice Chair
/u/V_i_r, Numerics (SG6) Chair
/u/hanickadot, Compile-Time programming (SG7) Chair, Evolution (EWG) Vice Chair, Czech National Body Chair
/u/tahonermann, Unicode (SG16) Chair
/u/mtaf07, Contracts (SG21) Chair
/u/timur_audio, Contracts (SG21) Vice Chair
... and others ...