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

Richard Smith (editor) (Google Inc)
Dawn Perchik (co-editor) (Embarcadero Technologies Inc)
Thomas Köppe (co-editor) (Google DeepMind)


Special thanks to the members of the editing committee for the C++17 DIS, namely Marshall Clow, Mike Miller, Ville Voutilainen, and Jeffrey Yasskin for their review of the correctness of the working paper as modified by the motions from the Kona 2017 meeting.

Special thanks also to Jonathan Wakely and Alisdair Meredith for performing edits and editorial review for several of the motions applied since N4640, and to Jens Maurer for performing many of the editorial fixes since N4640.

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

New papers

The contents of N4659 and N4660 are identical except for the cover sheet and page headings.

Motions incorporated into working draft and C++17 DIS

Core working group motions

CWG motion 1: Core issue resolutions for 5 issues in "ready" status applied:

The other 7 issues in "ready" status from P0575R1 were applied by CWG Motion 3

CWG motion 2: Core issue resolutions for 5 issues in "tentatively ready" status applied:

CWG motion 3: Core issue resolutions for 12 issues in "ready" and "tentatively ready" status applied, resolving 13 issues:

CWG motion 4: P0612R0 "NB comment CH 2: volatile", resolving 1 NB comment:

CWG motion 5: P0613R0 "NB comment GB15: Resolution of Core Issue 2011", resolving 1 NB comment and 1 issue:

CWG motion 6: P0298R3 "A byte type definition", resolving 3 NB comments:

CWG motion 7: P0615R0 "Renaming for structured bindings"

CWG motion 8: P0620R0 "Drafting for class template argument deduction issues", resolving 3 NB comments:

CWG motion 9: P0270R3 "Removing C dependencies from signal handler wording" with changes, see below, resolving 1 NB comment:

CWG motion 10: P0250R3 "Wording improvements for initialization and thread ids", resolving 2 issues in "concurrency" status:

CWG motion 11a applies to the Modules TS.

CWG motion 11b was not approved.

Library working group motions

Issue resolutions

LWG motion 1 applies to the Coroutines TS.

LWG motion 2: Library issue resolutions for 22 issues in "Ready" and "Tentatively Ready" status applied, resolving 23 issues:

Resolution of 2812 "Range access is available with <string_view>" not applied, as this issue had already been resolved editorially

LWG motion 3: Library issue resolutions for 3 issues in "Review" status applied:


LWG motion 4: P0317R1 "Directory entry caching for filesystem" with changes, see below

LWG motion 5: P0492R2 "Proposed resolution of C++17 National Body comments for filesystems", resolving 31 NB comments and 2 issues:

LWG motion 6: P0430R2 "File system library on non-POSIX-like operating systems", resolving 6 NB comments:

Parallel algorithms

LWG motion 7: P0452R1 "Unifying <numeric> parallel algorithms", partially resolving 2 NB comments:

LWG motion 8: P0518R1 "Allowing copies as arguments to function objects given to parallel algorithms", resolving 1 NB comment:

LWG motion 9: P0523R1 "Complexity of parallel algorithms", partially resolving 1 NB comment:

LWG motion 10: P0574R1 "Algorithm complexity constraints and parallel overloads", partially resolving 1 NB comment:

LWG motion 11: P0467R2 "Iterator concerns for parallel algorithms", partially resolving 2 NB comments:

LWG motion 12: P0623R0 "Final C++17 parallel algorithms fixes", partially resolving 3 NB comments:

NB response papers

LWG motion 13: P0604R0 "Resolving GB 55, US 84, US 85, US 86", resolving 4 NB comments:

LWG motion 14: P0607R0 "inline variables for the standard library", resolving 2 NB comments:

LWG motion 15: P0618R0 "Deprecating <codecvt>", resolving 3 NB comments:

LWG motion 16: Revert P0181R1 "Ordered By Default", applied by 2016-06 LWG Motion 21, resolving 1 NB comment:

LWG motion 17: P0156R2 "Variadic lock guard", resolving 2 NB comments:

LWG motion 18: P0599R1 "noexcept for hash functions", resolving 1 NB comment:

LWG motion 19: P0433R2 "Integrating template deduction for class templates into the standard library", resolving 2 NB comments and 3 issues:

Despite the claims of this paper and the wording of Motion 19, this paper is unrelated to US 14

NB issue resolutions

LWG motion 20: Library issue resolutions for 23 issues in "Immediate" status applied, resolving 20 NB comments:

Note: the resolutions of issues 2894 and 2911 in P0625R0 are not included in this motion

LWG motion 20a was not approved.

LWG motion 20b: Library issue resolution for 1 issue in "Immediate" status applied, resolving 1 NB comment:

Non-NB-comment papers

LWG motion 21: P0558R1 "Resolving atomic<T> named base class inconsistencies"

LWG motion 22: P0548R1 "common_type and duration"

LWG motion 23 applies to the Ranges TS.

Notable editorial changes


NB comments

ISO Directives

Content rearrangement

Stable name changes

Minor editorial fixes

A log of editorial fixes made since N4640 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 dbf3efe18813054c95abae388c53bf30e96e7e83
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 20 15:19:47 2017 -0700

    [intro.refs], [intro.defs] Update introductory text to match latest ISO

commit 32825151765e214d79103a137aa29a9a4357687f
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 20 15:00:51 2017 -0700

    Replace "this International Standard" with "this document" in some
    places where it is a clear improvement.

    The 7th Edition of the ISO Directives no longer require us to use
    "this International Standard" when the document refers to itself. We
    retain that phrasing when the reference is to the abstract notion of
    the specification as opposed to the text embodying it.

    This is a step towards addressing #1389.

commit 1798a9b6795d6ee92bf093e2a6256c34212552b1
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 20 14:14:22 2017 -0700

    [fs.path.generic] Refactor generic pathname grammar to remove redundancy and ambiguity.

commit 660d97e40353337b0b6b533903ab16e330855a77
Author: Eelis van der Weegen <eelis@eelis.net>
Date:   Sat Aug 6 18:02:50 2016 +0200

    [depr.func.adaptor.typedefs] Clarify that reference_wrapper does not define argument_type for non-nullary member function pointer types.

commit 95cbc03c20f20d98a53a3e696df6003ec27abc42
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Feb 8 16:35:25 2017 +0100

    [istreambuf.iterator] Join subsections for operations descriptions.

    There was one subsection for every operator, yet everything
    fits on half a page.

    Fixes #1429, #1449.

commit d2b6fb6eefc3c28eb448352cd6d8b0d08e860a66
Author: Jonathan Wakely <cxx@kayari.org>
Date:   Thu Mar 16 21:27:11 2017 +0000

    [containers] Rephrase deduction guide constraints

    Replace "is called with" wording that doesn't apply to deduction guides.

    Move rules about qualifying as input iterators or allocators to

commit a7f52d1904e5a6d2d407eb4145ba54552d0b3e69
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Mar 20 00:07:04 2017 -0700

    [fs.path.generic] Move descriptions of grammar elements out of the
    grammar and into separate paragraphs, and format path grammar as we
    format the language grammar.

    Also rephrase description of root-name to use the defined term
    "implementation-defined" directly rather than separating it into
    "implementations [...] define".

commit 04a9e5d759b4fea810ed029dd6b6a0d5ebfd224a
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Feb 10 22:46:20 2017 +0100

    [fs.op.copy], [fs.op.copy_file] Rephrase requirements on copy_options.

    Use bitmask 'element' phrasing for restrictions on copy_options.

    Fixes #1445.

commit df9a809a36c34acc0870c5d7869e7549574e1437
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Sat Mar 18 23:08:32 2017 +0100

    [partial.sort] Remove 'It takes' from complexity specification.

    Partially addresses #1088.

commit 5cf60394dbe171ec16bfbba1459772e40b9cf6e1
Author: Thomas Köppe <tkoeppe@google.com>
Date:   Sat Mar 18 21:21:14 2017 +0000

    [temp.class.spec.mfunc] Add missing comment to example

commit cdd6dda21e3273ea63b733c3cfb3b630bb1847eb
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Thu Mar 16 15:37:17 2017 -0700

    [xref] Add glossary of cross-references between C++14 section labels and
    C++17 section labels.

    Fixes #1547.

commit 88c20950fac6915844143bb73129e2eb1b41d17d
Author: Jonathan Wakely <cxx@kayari.org>
Date:   Thu Mar 16 02:51:38 2017 +0000

    [filesystem] Shorten stable names and add "fs." prefixes

    [class.path] -> [fs.class.path]
    [path.generic] -> [fs.path.generic]
    [path.cvt] -> [fs.path.cvt]
    [path.fmt.cvt] -> [fs.path.fmt.cvt]
    [path.type.cvt] -> [fs.path.type.cvt]
    [path.req] -> [fs.path.req]
    [path.member] -> [fs.path.member]
    [path.construct] -> [fs.path.construct]
    [path.assign] -> [fs.path.assign]
    [path.append] -> [fs.path.append]
    [path.concat] -> [fs.path.concat]
    [path.modifiers] -> [fs.path.modifiers]
    [path.native.obs] -> [fs.path.native.obs]
    [path.generic.obs] -> [fs.path.generic.obs]
    [path.compare] -> [fs.path.compare]
    [path.decompose] -> [fs.path.decompose]
    [path.query] -> [fs.path.query]
    [path.gen] -> [fs.path.gen]
    [path.itr] -> [fs.path.itr]
    [path.non-member] -> [fs.path.nonmember]
    [path.io] -> [fs.path.io]
    [path.factory] -> [fs.path.factory]
    [class.filesystem_error] -> [fs.class.filesystem_error]
    [enum.path.format] -> [fs.enum.path.format]
    [enum.file_type] -> [fs.enum.file_type]
    [enum.copy_options] -> [fs.enum.copy.opts]
    [enum.perms] -> [fs.enum.perms]
    [enum.perm_options] -> [fs.enum.perm.opts]
    [enum.directory_options] -> [fs.enum.dir.opts]
    [class.file_status] -> [fs.class.file_status]
    [file_status.cons] -> [fs.file_status.cons]
    [file_status.obs] -> [fs.file_status.obs]
    [file_status.mods] -> [fs.file_status.mods]
    [class.directory_entry] -> [fs.class.directory_entry]
    [directory_entry.cons] -> [fs.dir.entry.cons]
    [directory_entry.mods] -> [fs.dir.entry.mods]
    [directory_entry.obs] -> [fs.dir.entry.obs]
    [class.directory_iterator] -> [fs.class.directory_iterator]
    [directory_iterator.members] -> [fs.dir.itr.members]
    [directory_iterator.nonmembers] -> [fs.dir.itr.nonmembers]
    [class.rec.dir.itr] -> [fs.class.rec.dir.itr]
    [rec.dir.itr.members] -> [fs.rec.dir.itr.members]
    [rec.dir.itr.nonmembers] -> [fs.rec.dir.itr.nonmembers]

commit ad33212fded427f1e0b4e57c53c9e9215318b223
Author: Alisdair Meredith <public@alisdairm.net>
Date:   Thu Mar 16 11:21:05 2017 -0400

    [any.modifiers] fix emplace return type for 'any' (#1545)

    LWG issue 2857 was applied verbatim, without noticing
    that 'ValueType' had been previously changed to 'T'.
    This makes things consistent by choosing 'T' as the
    simpler form, more consistent with 'optional' and

commit 09e4674b0b6ab2f74bfe5a14120edea874115779
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Tue Feb 28 07:27:01 2017 +0100

    [expr.prim.lambda] Move syntactic restriction on decl-specifier-seq to the front.

    Per CWG guidance.

commit 763a3fda5cec74d17371ddf4957f1f522331ebb0
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Nov 30 19:17:52 2016 +0100

    [expr.prim.lambda] Split specification of lambda expressions into subsections.

    Fixes #1155.

commit 8139f2f9ec81cf4b8c24640f968880241dd23231
Author: Thomas Köppe <tkoeppe@google.com>
Date:   Thu Nov 17 19:51:44 2016 +0000

    Move specification of deprecated headers to Annex D

commit c9354b33e1de8e0cf6dc42a73c733e1d8a34e7e0
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Mar 15 18:29:49 2017 -0700

    Update value of __cplusplus to 201703L.

    Fixes #1513 and NB CA 15 and US 83 (C++17 CD).

commit 8baa18cbbf33a9b73711638b13a4960e15179c6d
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Mar 15 18:29:13 2017 -0700

    Add acknowledgement of ECMAScript trademark.

    Fixes NB GB 10 (C++17 CD).

commit 4d53b8b250751aae7768955f75eb7f27db08d83e
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Mar 15 12:55:55 2017 -0700

    Editorial fixes for P0317R1.

    [directory_entry.mods] Improve singular/plural, add commas.

    [class.directory_iterator] Reorder words to more closely align xref with
    the term for which it is a reference, add comma.

commit dd42ed5d6e04e623992e0464e49323a2b6a1f518
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Sun Mar 12 14:34:57 2017 -0700

    [atomics.flag] Replace "shall be" with "is" when describing properties
    of the implementation, for consistency with changes made by P0558R1.

commit 49caa2b829256f8198ed649ca3f5057bde96a2c7
Author: Thomas Köppe <tkoeppe@google.com>
Date:   Sun Mar 5 09:19:33 2017 -1000

    [func.search] Add missing period

commit 4f0891849e4799367174cc8783a3d88b6ff6b95a
Author: Jonathan Wakely <cxx@kayari.org>
Date:   Fri Mar 3 02:36:27 2017 +0000

    [meta.trans] replace "shall name" with "names" in traits tables

commit 42c6d5cc8ed83ba4b48b8b94d51b7a317d577a46
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Tue Dec 20 21:45:21 2016 +0100

    [lib] For showing complexity, use $N \log N$
    and not $N \log(N)$ or other variants.

    Partially addresses #1088.

commit 42c5a2ce36d7403ca37cb8b038aa37065c353ba4
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Tue Dec 20 23:45:26 2016 +0100

    [intro.refs] Add normative references to LIA-1 and IEEE 754.

    Fixes #237.

commit bdff8687ccb470564400597403d484ad02890f24
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Fri Feb 10 21:25:42 2017 +0100

    [any] Use 'contained value' consistently.

    This harmonizes the use of 'constained value' across
    optional, variant, and any, with appropriate index

    Fixes #1401.

commit 6a5edb752b88c448dce4cba528de307d79966b9e
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Thu Feb 9 21:42:49 2017 +0100

    Harmonize punctuation for 'ill-formed, no diagnostic required'

    Fixes #1450.

commit 40f3fb37986ecff07567cc4601fac334fee8aff9
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Feb 8 15:35:43 2017 +0100

    [basic.types] Remove excessive references to [basic.type.qualifier].

    Fixes #1419.

commit ee930ef3ee97f244d278ac3f762ec5f167dc005a
Author: Jonathan Wakely <cxx@kayari.org>
Date:   Thu Mar 2 02:20:48 2017 +0000

    [rand.dist.bern.negbin] Fix index for k member

commit bbcf0ea60c63d741bc51818633c70df2690e99b4
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Wed Mar 1 13:34:52 2017 -1000

    Add a note to the definition of literal type to indicate that it is not
    a guarantee that such an object can be created in a constant expression.

    Wording from John Spicer / CWG.

    Addresses NB GB 68 (C++17 CD).

commit be54f2e8e12c54071692ef3ebd6e49f6e3255a27
Author: Jakub Wilk <jwilk@jwilk.net>
Date:   Tue Feb 28 19:17:32 2017 +0100

    [diff.decl] Fix typo (#1494)

commit 2f6aff7e71cc33243671d1e501911d331af61fa3
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Feb 27 16:23:46 2017 -1000

    [basic.stc] Fix introductory sentence on dynamic storage duration to
    match later more-normative rule: it applies to objects, not storage.

    Fixes NB JP 3 (C++17 CD).

commit ec4ca6fc07907ea817152970c45d4c04c86d3c5c
Author: Richard Smith <richard@metafoo.co.uk>
Date:   Mon Feb 27 11:30:27 2017 -0800

    [intro] Promote "Scope", "Normative references", "Terms and definitions"
    to top-level clauses per ISO directives.

    Modify \definition macro so we can more easily have definitions at
    different depths in different lists.

commit fe6c8bda60fbca2cd3a488650988ce0a7df20d03
Author: Eelis <github.com@contacts.eelis.net>
Date:   Fri Feb 24 12:09:31 2017 +0100

    [localization, diff] Remove superfluous 'return 0;' from 'main' in examples. (#1482)

commit 17e28024d81e366a6d1044fa29a0cd1bdf10f77f
Author: Eelis <github.com@contacts.eelis.net>
Date:   Thu Feb 23 12:32:58 2017 +0100

    [meta.unary.prop, meta.trans.other] Omit unhelpful second argument in static_asserts. (#1479)

commit 33f16cb3417ad21949769d82cae36c1b653e4519
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Thu Feb 23 01:47:09 2017 +0100

    [dcl.attr.nodiscard] Clarify example with reference return type. (#1471)

    Add rationale why a warning is not encouraged for this case.

    Fixes #1470.

commit 7cd42666e143e19bdaf9e62211066cab255fb99f
Author: Eelis <github.com@contacts.eelis.net>
Date:   Thu Feb 23 01:25:26 2017 +0100

    [expr.mptr.oper] Use defined term 'null member pointer value'. (#1434)

commit 5bc5cbae28d9e741ebc7df996f1f0d230ac4087e
Author: Eelis <github.com@contacts.eelis.net>
Date:   Tue Feb 21 00:16:14 2017 +0100

    [rand.req.{eng,dist}] Replace square brackets around reference with regular parentheses. (#1481)

commit 44f489bba7c7595077043c7360cf7ff329eeb090
Author: Eelis <github.com@contacts.eelis.net>
Date:   Sun Feb 19 15:41:48 2017 +0100

    [except.spec] Add missing 'an'. (#1478)

commit 16938d84892051f5c9e2fe4afca578fc57b1c4f3
Author: Thomas Köppe <tkoeppe@google.com>
Date:   Sat Feb 18 19:21:13 2017 +0000

    [support.runtime] Remove extraneous and misleading parentheses from names of functions and macros

commit d2fe52eaaf53b6843ab6fe152a2a05e5a7da06fc
Author: Eelis <github.com@contacts.eelis.net>
Date:   Thu Feb 16 20:54:49 2017 +0100

    [alg.min.max] Enlarge lfloor/rfloor delimiters. (#1455)

commit 7e5537d1e9c7a6d63c9877cf5babde4ddf14807c
Author: Eelis <github.com@contacts.eelis.net>
Date:   Wed Feb 15 15:38:19 2017 +0100

    Parenthesize some \refs. (#1436)

commit 473966e60653e8e2bc8ed154d8b18a3736f97088
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Thu Feb 9 12:14:12 2017 +0100

    [unord.req] Insert hint is 'p', not 'q' (#1440)

    LWG 2540 changed the hint for insert from 'q'
    (a valid and dereferenceable iterator) to 'p'
    (a valid, but not necessarily dereferenceable iterator),
    but neglected to adjust the description text.

    Fixes #1423.

commit 90c486f80612c3a7fd26ee408631991814f7b81c
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date:   Wed Feb 8 17:21:31 2017 +0100

    [any.assign] Rename T to VT. (#1448)

    These renames were overlooked in commit 8b1f6cc8d73eec0306db1dec66f2da52a03ea274.

    Fixes #1443.