N4811 Editors' Report -- Programming Languages -- C++

Richard Smith (editor) (Google Inc)
Thomas Köppe (co-editor) (Google DeepMind)
Jens Maurer (co-editor)
Dawn Perchik (co-editor) (Bright Side Computing, LLC)


Special thanks to Marshall Clow for supplying the LaTeX sources for

and to Gor Nishanov for supplying a pull request for P0912R5 (CWG motion 15, 22 pages of wording changes).

Thanks to all those who have submitted editorial issues and to those who have provided pull requests with fixes.

New papers

Motions incorporated into working draft

Core working group motions

CWG motion 1: Core issue resolutions for 14 issues in "ready" status applied, 1 not applied:

CWG motion 2: Core issue resolutions for 22 issues in "tentatively ready" status applied, resolving 24 issues:

CWG motion 3: P1286R2 "Contra CWG DR1778" (DR)

CWG motion 4: P1091R3 "Extending structured bindings to be more like variable declarations"

CWG motion 5: P1381R1 "Reference capture of structured bindings"

CWG motion 6: P1041R4 "Make char16_t/char32_t string literals be UTF-16/32"

CWG motion 7: P1139R2 "Address wording issues related to ISO 10646"

CWG motion 8: P1323R2 "Contract postconditions and return type deduction"

CWG motion 9: P0960R3 "Allow initializing aggregates from a parenthesized list of values"

CWG motion 10: P1009R2 "Array size deduction in new-expressions" (DR)

CWG motion 11: P1103R3 "Modules"

CWG motion 12: P1185R2 "<=> != =="

CWG motions 13 and 14 apply to the Reflection TS

CWG motion 15: P0912R5 "Coroutines"

Core motions added a total of 24 pages (and 1 Clause) to Clause 1-15

Library working group motions

LWG motion 1 applies to the Library Fundamentals TS

LWG motion 2: Library issue resolutions for 2 issues in Ready status and 11 issues in Tentatively Ready status applied:

LWG motion 3: P0339R6 "polymorphic_allocator<> as a vocabulary type"

LWG motion 4: P0340R3 "Making std::underlying_type SFINAE-friendly"

LWG motion 5 was retracted

LWG motion 6: P0738R2 "I Stream, You Stream, We All Stream for istream_iterator"

LWG motion 7: P1458R1 "Mandating the standard library: clause 16 - language support library"

LWG motion 8: P1459R1 "Mandating the standard library: clause 18 - diagnostics library"

LWG motion 9: P1462R1 "Mandating the standard library: clause 20 - strings library"

LWG motion 10: P1463R1 "Mandating the standard library: clause 21 - containers library"

LWG motion 11: P1464R1 "Mandating the standard library: clause 22 - iterators library"

LWG motion 12: P1164R1 "Make create_directory() intuitive" (DR)

LWG motion 13: P0811R3 "Well-behaved interpolation for numbers and pointers"

LWG motion 14: P1001R2 "Target vectorization policies from Parallelism V2 TS"

LWG motion 15: P1227R2 "Signed ssize() functions, unsigned size() functions "

LWG motion 16: P1252R2 "Ranges design cleanup"

LWG motion 17: P1024R3 "Usability enhancements for std::span"

LWG motion 18: P0920R2 "Precalculated hash values in lookup"

LWG motion 19: P1357R1 "Traits for [un]bounded arrays"

Library motions added a total of 7 pages to Clause 16-32.

Notable editorial changes

CWG motion 1

The edits for CWG2310 inadvertantly required the base class to be complete instead of the derived class in one of the edits. After consultation with CWG, the derived class is now required to be complete in all cases.

The edits for CWG2331 were intended to be an editorial cleanup and wording simplification, but were found to have unintentional normative effect. This issue is being returned to CWG for redrafting.

The edits for CWG2332 added a note that was not entirely accurate. The note, along with the normative text that it references, have been rephrased to clarify that an injected-class-name is never interpreted as a template-name in a context in which class template argument deduction would apply (even though it can be interpreted as a template-name in some cases in a context where a decl-specifier might be parsed, such as in a template-argument).

CWG motion 2

The wording moved for CWG2020 inadvertantly omitted some edits that were part of the wording reviewed by CWG. Those edits were not substantive, and have been restored editorially.

CWG motion 12

Removed redundant restatement of the operator== symmetry rule in defaulted operator!=; looking for reversed candidates and rewriting == expressions is already handled by overload resolution, and a reversed operator== can never be selected anyway because the two arguments are of the same type.

Likewise the corresponding redundant wording was removed from the rules for defaulted operators <, >, <=, and >= that inaccurately claimed they could select a reversed operator<=>.

CWG motion 15

Modernized the wording to follow current editorial conventions, and simplified where possible.

Fixed a contradiction between the core and library wording; the library wording allowed a coroutine_handle<> to resume any coroutine, but the core wording did not account for that possibility and only permitted resumption via a coroutine_handle<P> with the right promise type P.

LWG motion 2

Replaced the references to CopyConstructible and CopyAssignable with the intended Cpp17CopyConstructible and Cpp17CopyAssignable after consultation with LWG.

Section label changes

Several section labels introduced by the motions papers have been modified to match our style guide. In addition to the section labels affected by the above motions, all section labels containing underscores have been renamed to instead use periods.

Reversion of prior editorial change

In N4791 (the post-San-Diego working draft), an editorial change was applied to repair missing wording in 2018-11 CWG motion 14 (P0595R2 "std::is_constant_evaluated()"). This change added a definition of the term "usable in constant expressions" as applied to objects and references that was inadvertantly dropped from the wording during CWG review.

Further review within CWG has shown that the dropped wording is also incorrect, so the editorial fix has been reverted (leaving the definition absent rather than incorrect), and a proper definition will be inserted by a core issue.

Minor editorial fixes

A log of editorial fixes made to the working draft since N4800 is below. This list excludes changes that do not affect the body text or only affect whitespace or typeface. For a complete list including such changes (or for the actual deltas applied by these changes), consult the draft sources on github.

commit 142acf0bbde8d6fd20cb67c051d896fec33a84b6
Author: stryku <stryku2393@gmail.com>
Date:   Thu Oct 11 18:41:18 2018 +0200

    [decl.init]/10 Fix specified initialization.

    According to [basic.start.static]/2, for objects with static storage duration,
    zero initialization performs only if constant initialization does not.
    [decl.init]/10 can be generalized to static initialization.
    This is an editorial note change.

commit 74def77454a15b6cdb45be0f31916396b4b63b72
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 15 13:45:06 2019 -0700

    [util.smartptr.atomic.shared] [util.smartptr.atomic.weak] Clarify
    grouping of "either".

commit 4c5701a79cc7c4cc7b9cd9c6070e3cd88961aca7
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Dec 21 21:04:43 2018 +0100

    [mismatch] LWG3178 std::mismatch is missing an upper bound

commit 04a5e31a02e19e5d1c9e9a0b05c40ce8730c7064
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sat Jan 26 00:30:13 2019 +0100

    [algorithms] Qualify declarator-id with sub-namespace.

    Also qualify return types where appropriate.

commit 6c844190a533950fc0100eac4da7785d99c87400
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 15 20:25:59 2019 +0100

    [time.clock.req] Change 'satisfy' to 'meet'.

commit c3adaef44b94cc63a8a8806f398185046461947c
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 15 19:23:30 2019 +0100

    [numeric.requirements] Define 'numeric type'.

commit 1ce86a62a3cff9fb2bcf6c1a2c37168e023e338b
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sat Mar 9 22:18:26 2019 +0100

    [time.clock.req] Simplify requirements for Cpp17TrivialClock.

commit 0ba5424c1beddfd8c8403ce882b96dee0f530c7f
Author: JF Bastien <github@jfbastien.com>
Date:   Fri Mar 15 13:52:39 2019 -0700

    [basic.fundamental] Rename 'range exponent' to 'width' to align with C

commit 9e00558f2a824421406a6703d1232cc4fb89bb15
Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
Date:   Fri Mar 15 16:43:16 2019 -0400

    [std] Fix a bunch of faulty parallelism with "either".

commit 54ddcb970132bfe026c9d9d62d967632b56ae303
Author: BRevzin <barry.revzin@gmail.com>
Date:   Fri Mar 15 15:30:07 2019 -0500

    [class.rel] Simplifying wording to avoid talking about a reversed <=>.

    We can never select a reversed <=> here because the operands are of the same type.

commit 5d174b05d8cd08717ed7efc05d0271409651071c
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 15 12:33:42 2019 -0700

    [expr.prim.lambda.capture] Convert paragraphs repeating the
    "non-odr-usable local entities shall not be odr-used" rule from
    [basic.def.odr] into notes.

commit 41853024e5e6fcd5feb496f64767d2888d76154f
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 15 11:38:57 2019 -0700

    Revert "[expr.const] Add missing definition of 'usable in constant expressions'"

    The prior editorial fix was an attempt to re-add wording that was
    missing from P0595R2 (moved as 2018-11 CWG Motion 14). However, CWG
    analysis has indicated that the editorial fix is incomplete, so we're
    reverting it to restore the wording to the as-moved state.

    This reverts commit e58439bce8af85e6569328272c2cfb73f5fc44d6.

commit 154f2c59c4377897937f4b0722cfe2b6d726cc59
Author: birbacher <frank.birbacher@gmail.com>
Date:   Fri Mar 15 18:39:16 2019 +0000

    [container.node] Add 3 "template" keywords for dependent name (#2676)


commit 2585d7f5894b46e0aa2f961183060a5201b2cca7
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Dec 21 19:29:38 2018 +0100

    [std] Replace underscores in stable labels with periods.

commit 554a8926404bd5e0f772a6cb72c04bd12a5b7984
Author: Casey Carter <Casey@Carter.net>
Date:   Mon Mar 4 09:29:50 2019 -0800

    [specialized.algorithms] Rename voidify's parameter

    `ptr` is an odd name for a parameter that is a reference to storage for an object.

commit a2dfa61a0d50a24e7be6cbc004bb0f076b8c62b5
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 8 22:25:38 2019 +0100

    [queue.syn,stack.syn] Add partial specialization of uses_allocator

commit 721f2d606f90cc20a16ad9b4383bc78cb368abdc
Author: Jonathan Wakely <github@kayari.org>
Date:   Fri Mar 15 02:53:18 2019 +0000

    [func.not_fn], [func.bind_front] fix phrasing of \mandates and \expects (#2750)

    The Mandates: element should just state its condition, and not say "shall".
    Cpp17 concept requirements should be phrased as "X meets the
    Y requirements" not "X shall meet the requirements of Y".

commit 48484c967ee5f3ecb65ff857f8f4794e108ba0cb
Author: Krystian <sdkrystian@gmail.com>
Date:   Thu Mar 14 22:49:33 2019 -0400

    [temp.class.spec.mfunc] Correct "class template specialization" to the intended "class template partial specialization"

commit 3117814eaf800a5e1dd387f4c5a0522f2627689e
Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
Date:   Fri Mar 15 05:48:28 2019 +0300

    [expr.sizeof] Remove the redundant paragraph 3

    Paragraph 1 already says that functions are disallowed and function pointers are allowed.

commit c769f835dadd4a35df9febad684a296d6cb71a53
Author: JF Bastien <github@jfbastien.com>
Date:   Thu Mar 14 19:45:53 2019 -0700

    [dcl.attr.contract.cond] Replace return type with 'void' in example that does not return

    Also remove the (unused) name for the return value in the postcondition.

commit d48c79e223cfbd5ec134703e20989235208e9364
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 8 01:14:16 2019 +0100

    [dcl.enum] Fix singular/plural mismatch.

commit c5fb73ba6a9b71f6e247103ab4baac1c9f72e210
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 8 01:13:35 2019 +0100

    [conv.prom] b_min and b_max are no longer defined in [dcl.enum]

commit d7d2580c7d8fabe25ada4dd0e091f9997c0916f5
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sat Mar 9 22:36:47 2019 +0100

    [range.iota,range.adaptors] Add cross-references for private member types.

commit b8fd249c737ff2c3652cf6ef77db25712038d353
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sun Mar 10 20:20:10 2019 +0100

    [dcl.init] Prepend 'Otherwise' to a bullet

commit dd227824ade24ab51dd4cc926c4b9e87cc29becf
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sun Mar 10 20:28:41 2019 +0100

    [dcl.attr.contract.cond] References cannot be modified.

    Avoid confusion caused by using the words "makes [...]
    modifications of the value of [a] parameter" by excluding

commit b0116b87bf33fed9648e6e8b1b0c7cee0d90b311
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Mar 12 09:06:23 2019 -0400

    [over.match.best] Add number for paragraph 2.

commit f0f7ba234644d3690d18fcba73f618648014a47c
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Mar 13 22:21:42 2019 +0100

    [lib] Use '(inclusive)', not other punctuation

    to indicate inclusive ranges in prose.

commit 5ba461ec9836f95ed7a54b563b06d480f564e987
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Mar 13 22:46:19 2019 +0100

    [class.eq,class.spaceship] Clarify order of comparison.

commit 42e5df5c08c9ef805da304fe05fe387cfc3d33d5
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Thu Mar 14 00:02:25 2019 +0100

    [basic.lookup.argdep] Reorder bullets to group semantics.

commit 927dc13e1010e031692f3a94d8e9599beeb877ac
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Thu Mar 14 17:22:07 2019 -0700

    [array.tuple] Fix broken description of tuple_element for std::array.

commit 0b06fcd5f92bc0439a868471a5fdfdba8a181941
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Mar 8 22:12:14 2019 +0100

    [ranges.syn] Add ref_view to header synopsis.

commit 6f6e5772b2a2dcf41e3db4f68b6cbc3c0628c061
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Thu Mar 14 16:05:33 2019 -0700

    [algorithms.parallel.exec] Rephrase to avoid incorrect use of "may not".

    Convert rationale sentence to a note.

commit de76c7de8c4f9734e0e4351d2088d4786ee62135
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Tue Mar 5 21:57:10 2019 +0100

    [char.traits.typedefs] Change 'shall meet' to 'meets'

commit e11e27a7873953f0c078901f7ddbb0d7d701c5f7
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Mar 6 21:15:37 2019 +0100

    [mem.poly.allocator.mem] Avoid duplicate colons.

commit 2956ba37186d7e9cbe728cc3870a2a26fb1f0168
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Mar 13 14:14:43 2019 -0700

    [dcl.fct.def.coroutine] Update wording to align with current editorial

    Reorder and rearrange to reduce the number of variables with long scopes
    that we define in the wording.

    Fix mismatch between core and library wording where library permits
    coroutine_handle<void> to resume a coroutine with any promise type, and
    the core language does not.

commit 8dd4539b24473677809163f5e6d399ba6aa0b27d
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Tue Mar 12 18:15:59 2019 -0700

    [expr.await] Rephrase and modernize wording.

    Invoke temporary materialization conversion directly rather than
    handwaving about a temporary object. Specify that the o expression is
    evaluated. Bulletize description of the three different ways that
    await-suspend is called.

    Fix wording that uses values and objects on the left-hand side of a
    class member access to instead consistently use expressions.

    Fixes #2774.

commit d69814f61077f7e549ccc39a21fc3b90db4223d6
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 11 20:12:17 2019 -0700

    [temp.param] "a type that is literal" -> "a literal type".

commit c0058816fdfe079095ca8717ad692dc2d498d6a3
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 11 20:11:46 2019 -0700

    [class.eq] Remove redundant repetition of the operator== symmetry rule.

commit 007c0c1a619417f94c2c4efb57be71c09f2c2870
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Mar 6 21:32:09 2019 +0100

    [temp.type] Do not refer to operator==, which excludes built-in ==.

commit caa5c8aedecdf68cfda4f5d95ec9d20451953117
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Tue Mar 5 19:05:25 2019 +0100

    [class.compare.default] Add a note that friends are found by ADL only.

commit c9074b533c835bbf820f5ea09957810ed2c04dab
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Mar 6 20:56:58 2019 +0100

    [expr.new] Move treatment of arrays of unknown bound

commit ce2f08ab94123adb44e58f1176c6ae4f3209eb60
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 11 17:20:25 2019 -0700

    [dcl.init] Merge new direct aggregate init wording into class direct
    initialization bullet to avoid the wording being unreachable due to an
    "Otherwise" chain.

commit 691b7c10530d3265afbf445dff3dd129c7c5692e
Author: Dawn Perchik <dperchik@embarcadero.com>
Date:   Sun Mar 10 16:15:53 2019 -0700

    [dcl.init] Moved the changed bullet in 17.5 to before 17.6.3.

commit 5f7461d24bc0e9867458a043adf04aa8c4ceed73
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 8 16:11:34 2019 -0800

    [temp.dep.type] Rephrase to avoid suggesting that an expression can be
    the current instantiation.

    A type can't be the current instantiation either, but that's a
    pre-existing prevalent problem.

commit cbb21fb0210b6aade5591de94e3a27d7059e9d06
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 8 16:08:02 2019 -0800

    [basic.def.odr] Apply additional edits from CWG review that were not
    transcribed into P1359R0.

commit ac732bfe4eef01e9e2443dac6138270695d7cbf9
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 8 12:24:49 2019 -0800

    [expr.prim.lambda.capture] Add missing close parentheses in CWG2358

    Fixes #2680.

commit 502e419ca75c9656394d1998036b4b810e8bdb17
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 8 12:00:26 2019 -0800

    [dcl.type.simple] Fix inaccurate note added by CWG2332

    [temp.local] Clarify that the surrounding syntax and construct directly
    dictates whether an injected-class-name is syntactically a template-name
    or a type-name, not just what it means.

commit f4346ece403e469e800d635a75baafb9c411aa1b
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Fri Mar 8 11:39:36 2019 -0800

    [expr.static.cast] Fix wording of CWG2310 to match CWG intent (verified
    on core reflector):

     - in p11, require D to be a complete class type, not B
     - in p12, rephrase to avoid the suggestion that we're talking about a
       different D than the one already in scope

commit 6f34b0513ed6d974b86a27429f8f4d02a6c18b88
Author: Hana Dusíková <hanicka@hanicka.net>
Date:   Fri Feb 22 11:03:29 2019 -1000

    [pair.astuple, tuple.helper] Fix inconsistent class key in tuple_size/tuple_element. (#2679)

    It was declared as a struct and specializations were classes.

commit 102a791b446f70f939a9b1e2e66fc3553aade19c
Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
Date:   Fri Feb 22 02:30:23 2019 -0400

    [array.syn] Add reference to [array.tuple]

commit 7fe655909b4e5f01d8a8b71d6b508785c42c739e
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Feb 20 17:04:55 2019 -1000

    [temp.dep] [temp.dep.res] Remove redundant restatement of the two-phase
    lookup rule. The primary location of the rule is [temp.dep.candidate].

commit 8fbeb52ae5daccc0352798ff023f6cba6aebcd42
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Feb 18 17:15:39 2019 -1000

    [basic.link] The notion of the linkage of a type is no longer used for
    any purpose. Remove it and move its example next to the rule that
    justifies it, and simplify said example.

commit cafdbd8036f3cf19e9cfc2f56584b219fb190602
Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
Date:   Fri Jan 25 00:12:44 2019 +0300

    [expr.sizeof]/2: there are no expressions of reference type

commit 35ce0ae2eb2582dbc00fc824afbfa1d53a64de8d
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Feb 13 17:51:58 2019 -0800

    [depr.array.comp] Fix example of deprecated array comparison

commit 2f0bd979f41953890129fcbdc6ef37e3e90387ad
Author: Alisdair Meredith <alisdairm@me.com>
Date:   Sun Feb 10 16:53:15 2019 -0500

    Add missing noexcept cross-refs for invokable traits (#2662)

    All the other traits that use the phrase 'is known not to throw exceptions' also cross-reference the core clause for the noexcept operator, so add the missing cross reference to the more recently added traits.

commit 9f261368736c3666791329145292c1563a291861
Author: Alberto Barbati <2210776+iaanus@users.noreply.github.com>
Date:   Sun Feb 10 22:52:36 2019 +0100

    [temp.mem.func] Fixed text in example, which was not updated by CWG 249 (#2658)

commit f668df034ebf27ad53b5addad22af4f1293f829f
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sun Feb 10 22:50:42 2019 +0100

    [algorithms.general,concepts.general] Add missing entries for summary tables (#2663)