diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index a2dcca1077..925ac7e8fe 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -18,14 +18,14 @@ jobs:
matrix:
cfg:
- { name: 'Linux', os: 'ubuntu-22.04' }
- - { name: 'MacOS', os: 'macos-12' }
+ - { name: 'MacOS', os: 'macos-13' }
steps:
- name: checkout
uses: actions/checkout@v3
- name: install GNU tools
- if: matrix.cfg.os == 'macos-12'
+ if: matrix.cfg.os == 'macos-13'
run: |
brew install gnu-sed
echo "/usr/local/opt/gnu-sed/libexec/gnubin" >> ${GITHUB_PATH}
@@ -34,7 +34,7 @@ jobs:
run: ../tools/check-source.sh
- name: update brew
- if: matrix.cfg.os == 'macos-12'
+ if: matrix.cfg.os == 'macos-13'
run: |
brew update
@@ -47,7 +47,7 @@ jobs:
run: sudo apt-get install latexmk texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended lmodern
- name: install (MacOS)
- if: matrix.cfg.os == 'macos-12'
+ if: matrix.cfg.os == 'macos-13'
run: |
brew install basictex
eval "$(/usr/libexec/path_helper)"
@@ -60,7 +60,7 @@ jobs:
run: make quiet
- name: make (MacOS)
- if: matrix.cfg.os == 'macos-12'
+ if: matrix.cfg.os == 'macos-13'
run: make full
- name: check-output.sh
diff --git a/README.rst b/README.rst
index 0bef62ee71..4ab1c20b2d 100644
--- a/README.rst
+++ b/README.rst
@@ -48,7 +48,7 @@ Getting Started on Arch Linux
Install the following packages:
- pacman -S texlive-latexextra
+ pacman -S make texlive-latexextra texlive-binextra texlive-plaingeneric texlive-fontsrecommended
-----------------------------
Getting Started on Microsoft Windows
diff --git a/papers/n4959.html b/papers/n4959.html
new file mode 100644
index 0000000000..958923da9f
--- /dev/null
+++ b/papers/n4959.html
@@ -0,0 +1,698 @@
+
+
+
+
+
+Codestin Search App
+
+
+N4959 Editors' Report -- Programming Languages -- C++
+
+Date: 2023-08-14
+
+Thomas Köppe (editor, Google DeepMind)
+Jens Maurer (co-editor)
+Dawn Perchik (co-editor, Bright Side Computing, LLC)
+Richard Smith (co-editor, Google Inc)
+
+Email: cxxeditor@gmail.com
+
+Acknowledgements
+
+Thanks to all those who have submitted editorial
+issues
+and to those who have provided pull requests with fixes,
+and special thanks to Johel Ernesto Guerrero Peña for providing in-depth review
+of many of the draft motion applications.
+
+New papers
+
+
+- N4958 is the
+current working draft for C++26. It replaces
+N4950.
+- N4959 is this Editors' Report.
+
+
+Motions incorporated into working draft
+
+Notes on motions
+
+All motions were applied cleanly. In a small number of cases, the approved
+wording was based on an older draft and needed reconciliation with intervening
+changes, but it was clear how to do this.
+
+
+- The wording for P1854R4
+("Making non-encodable string literals ill-formed", CWG Poll 3)
+has been reconciled with previous changes from
+P2314R4
+("Character sets and encodings").
+- For P0792R14
+("
function_ref
: a type-erased callable reference", LWG Poll 18),
+among some minor fixes for correctness and consistency,
+exposition-only members have been added explicitly to the class synopsis,
+which had only been mentioned in the descriptive text in the approved wording.
+- The feature test macro
__cpp_lib_format
has been modified three times, as follows:
+
+202304L
by
+P2510R3
+("Formatting pointers", LWG Poll 10)
+202305L
by
+P2757R3
+("Type checking format args", LWG Poll 20)
+202306L
by
+P2637R3
+("Member visit
", LWG Poll 21)
+
+- The feature test macro for
+P2641R4
+("Checking if a union alternative is active", LWG Poll 22)
+has been renamed from
__cpp_lib_within_lifetime
to __cpp_lib_is_within_lifetime
,
+which seems more appropriate and follows existing practice.
+- For P2630R4
+(
submdspan
, LWG Poll 29), numerous minor editorial corrections and improvements
+have been applied; see the full commit log for details.
+
+
+Core working group polls
+
+CWG Poll 1: Accept as Defect Reports and apply the proposed resolutions of all issues in
+P2922R0
+(Core Language Working Group "ready" Issues for the June, 2023 meeting) to the C++ Working Paper.
+
+CWG Poll 2: Accept as a Defect Report and apply the changes in
+P2621R2
+(UB? In my Lexer?) to the C++26 Working Paper.
+
+CWG Poll 3: Accept as a Defect Report and apply the changes in
+P1854R4
+(Making non-encodable string literals ill-formed) to the C++26 Working Paper.
+
+CWG Poll 4: Apply the changes in P2361R6
+(Unevaluated strings) to the C++26 Working Paper.
+
+CWG Poll 5: Apply the changes in P2558R2
+(Add @
, $
, and `
to the basic character set) to the C++26 Working Paper.
+
+CWG Poll 6: Apply the changes in P2738R1
+(constexpr cast from void*
: towards constexpr type-erasure) to the C++26 Working Paper.
+
+CWG Poll 7: Accept as a Defect Report and apply the changes in
+P2915R0
+(Proposed resolution for CWG1223) to the C++26 Working Paper.
+
+CWG Poll 8: Accept as a Defect Report and apply the changes in
+P2552R3
+(On the ignorability of standard attributes) to the C++26 Working Paper.
+
+CWG Poll 9: Accept as a Defect Report and apply the changes in
+P2752R3
+(Static storage for braced initializers) to the C++26 Working Paper.
+
+CWG Poll 10: Apply the changes in P2741R3
+(User-generated static_assert
messages) to the C++26 Working Paper.
+
+CWG Poll 11: Apply the changes in P2169R4
+(A nice placeholder with no name) to the C++26 Working Paper.
+
+Library working group polls
+
+LWG Poll 1: Apply the changes for all Tentatively Ready issues in
+P2910R0
+(C++ Standard Library Issues to be moved in Varna, Jun. 2023) to the C++ working paper.
+
+LWG Poll 2: Apply the changes in P2497R0
+(Testing for success or failure of <charconv>
functions) to the C++ working paper.
+
+LWG Poll 3: Apply the changes in P2592R3
+(Hashing support for std::chrono
value classes) to the C++ working paper.
+
+LWG Poll 4: Apply the changes in P2587R3
+(to_string
or not to_string
) to the C++ working paper.
+
+LWG Poll 5: Apply the changes in P2562R1
+(constexpr
Stable Sorting) to the C++ working paper.
+
+LWG Poll 6: Apply the changes in P2545R4
+(Read-Copy Update (RCU)) to the C++ working paper.
+
+LWG Poll 7: Apply the changes in P2530R3
+(Hazard Pointers for C++26) to the C++ working paper.
+
+LWG Poll 8: Apply the changes in P2538R1
+(ADL-proof std::projected
) to the C++ working paper.
+
+LWG Poll 9: Apply the changes in P2495R3
+(Interfacing stringstreams with string_view
) to the C++ working paper.
+
+LWG Poll 10: Apply the changes in P2510R3
+(Formatting pointers) to the C++ working paper.
+
+LWG Poll 11: Apply the changes in P2198R7
+(Freestanding Feature-Test Macros and Implementation-Defined Extensions) to the C++ working paper.
+
+LWG Poll 12: Apply the changes in P2338R4
+(Freestanding Library: Character primitives and the C library) to the C++ working paper.
+
+LWG Poll 13: Apply the changes in P2013R5
+(Freestanding Language: Optional ::operator new
) to the C++ working paper.
+
+LWG Poll 14: Apply the changes in P0493R4
+(Atomic maximum/minimum) to the C++ working paper.
+
+LWG Poll 15: Apply the changes in P2363R5
+(Extending associative containers with the remaining heterogeneous overloads) to the C++ working paper.
+
+LWG Poll 16: Apply the changes in P1901R2
+(Enabling the Use of weak_ptr
as Keys in Unordered Associative Containers) to the C++ working paper.
+
+LWG Poll 17: Apply the changes in P1885R12
+(Naming Text Encodings to Demystify Them) to the C++ working paper.
+
+LWG Poll 18: Apply the changes in P0792R14
+(function_ref
: a type-erased callable reference) to the C++ working paper.
+
+LWG Poll 19: Apply the changes in P2874R2
+(Mandating Annex D) to the C++ working paper.
+
+LWG Poll 20: Apply the changes in P2757R3
+(Type checking format args) to the C++ working paper.
+
+LWG Poll 21: Apply the changes in P2637R3
+(Member visit
) to the C++ working paper.
+
+LWG Poll 22: Apply the changes in P2641R4
+(Checking if a union alternative is active) to the C++ working paper.
+
+LWG Poll 23: Apply the changes in P1759R6
+(Native handles and file streams) to the C++ working paper.
+
+LWG Poll 24: Apply the changes in P2697R1
+(Interfacing bitset
with string_view
) to the C++ working paper.
+
+LWG Poll 25: Apply the changes in P1383R2
+(More constexpr
for <cmath>
and <complex>
) to the C++ working paper.
+
+LWG Poll 26: Apply the changes in P2734R0
+(Adding the new 2022 SI prefixes) to the C++ working paper.
+
+LWG Poll 27: Apply the changes in P2548R6
+(copyable_function
) to the C++ working paper.
+
+LWG Poll 28: Apply the changes in P2714R1
+(Bind front and back to NTTP callables) to the C++ working paper.
+
+LWG Poll 29: Apply the changes in P2630R4
+(submdspan
) to the C++ working paper.
+
+Editorial changes
+
+Noteworthy changes
+
+Some Unicode examples of the new formatting facilities had been missing from the
+last few working drafts (but are present in the C++23 DIS) because they needed
+some bespoke handling. This has now been integrated into the main branch, and
+the examples now appear correctly in the working draft. (The examples are
+generated with LuaTeX. As a side effect, the typeface used in existing diagrams
+has been changed to match the one used for the main body text. We have also
+explored switching the typesetting engine for the main document from eTeX to
+LuaTeX. This is possible in principle, but results in slightly lower typographic
+quality at the moment, so we are holding off on this and will revisit this
+change in the future.)
+
+The title of the working draft has been changed to "Working Draft, Programming
+Languages — C++", to match the official title of the standard more closely.
+
+Minor editorial changes
+
+A log of editorial fixes made to the working draft since N4950 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 abb81facf56f82a7487b3f64ae337ce2802c4bf3
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri May 12 09:38:16 2023 +0200
+
+ [intro.execution] Fix bad function call in example
+
+commit 42f21d84fb374b11d44c0b367bda649636128b6a
+Author: Andrew Rogers <adr26__github@nunsway.co.uk>
+Date: Wed Apr 19 01:03:57 2023 +0100
+
+ [dcl.init.aggr] Add missing apostrophe
+
+commit 4514233a48954d0fd0669236cc986640e33feb04
+Author: lprv <100177227+lprv@users.noreply.github.com>
+Date: Fri May 12 23:14:43 2023 +0200
+
+ [basic.compound] Fix cross-reference for 'incomplete type' (#6210)
+
+commit 4fac9f97a2c25d39a01f75cf198d0783bfa8deda
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Tue May 16 17:01:51 2023 +0100
+
+ [strings], [unord.req.general], [stringbuf.members]: Fix xrefs to [container.requirements.general]
+
+ All the references for "qualifies as an input iterator" and "qualifies
+ as an allocator" are supposed to be to [container.reqmts] p69 which
+ begins:
+
+ > The behavior of certain container member functions and deduction
+ > guides depends on whether types qualify as input iterators or
+ > allocators.
+
+ The reference in [string.require] for obtaining an allocator should be
+ to [container.reqmts] p64.
+
+ The reference in [string.require] Note 2 should be to
+ [container.requirements.pre] p3.
+
+ Fixes #6184
+
+commit 1be4801ac1f90aca9a8f5804a48e8bcd082f5bb9
+Author: lprv <100177227+lprv@users.noreply.github.com>
+Date: Thu Jun 1 20:57:05 2023 +0200
+
+ [lib] Refer to exposition-only function templates as templates, not functions (#6265)
+
+ * [tuple.apply]/1, /4
+ * [expected.object.assign]/1
+ * [iterator.cust.swap]/2
+ * [specialized.algorithms.general]/3
+
+commit c0685a584ea51d3e47381478a750729da3202b37
+Author: Géry Ogam <gery.ogam@gmail.com>
+Date: Tue Jun 13 18:21:59 2023 +0200
+
+ [basic.lval] Reword the misused term ‘classifications’ (#4913)
+
+commit ae4cba4dc8ee2437f39a451268ad6bc924076da0
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Tue Jun 20 13:29:38 2023 +0100
+
+ [cover-wd] A more appropriate title, and better line spacing
+
+commit 7e7afe0965e4e16ff651167212ea05ed9c0ef788
+Author: Eisenwave <me@eisenwave.net>
+Date: Thu Jul 6 12:45:54 2023 +0200
+
+ [expr.mul] Add missing commas (#6366)
+
+commit 384d36a0d30e6a8050e23f7193db40fb56ff4f06
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Thu Jul 6 20:45:10 2023 +0100
+
+ [filebuf.virtuals] fix "if width if less than zero" typo
+
+commit 964015779245341d64d93bbd0d1e11f050b32e70
+Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+Date: Mon Jul 10 18:53:10 2023 +0800
+
+ [time.duration.cons] Fix duplicate definition in example (#6372)
+
+commit e6c2f8fb0d5ad6cda3e2d3da63bd5d5e434635b4
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Tue Jul 18 23:16:59 2023 +0100
+
+ [diff.cpp23.expr] Fix environment ("example" should be "codeblock")
+
+commit 2109f579cc6749d19ddf9cf892e8aec4762ba344
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Jul 21 16:21:54 2023 +0100
+
+ [locale.general] Add cross-references to class synopsis
+
+commit c2e05a4080e8c79bcc9971054ca6fb6ae9b3e722
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Jul 21 17:05:10 2023 +0100
+
+ [functional.syn] Tweak cross-references in class synopsis
+
+commit 8334cc876d29595f0f2796a6de42acae937d8377
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Jul 21 23:29:54 2023 +0100
+
+ [functional.syn, func.wrap.move] Hyphenate "move-only wrapper"
+
+commit 7fb62d5f50bfbfc159df4ca0af932ee82d26bc41
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Jul 21 18:13:28 2023 +0100
+
+ [version.syn] Rename smart_pointer_owner_equality to smart_ptr_owner_equality
+
+ For consistency: the use of "ptr" is already prevailing.
+
+commit 56a6b7fe068726ace9196366c968cc679653cc04
+Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+Date: Wed May 17 23:27:22 2023 +0800
+
+ <ranges> Add missing colon for the Effects: Equivalent to return format
+
+commit a34d2e08bda9b1314ecec1b608745a88a678d664
+Author: vasama <git@vasama.org>
+Date: Wed Jun 7 11:01:02 2023 +0300
+
+ [expr.pre] Clarify note on pointer subtraction
+
+commit 96f695aea7589a62e5ebb55a18a40f985f7d89ce
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Tue Jun 13 09:18:01 2023 +0300
+
+ [basic.def.odr] Restructure requirements in p14-p15
+
+commit ebba9f316ddd8c120608447b00ea32bf3926a18d
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Sun Jul 23 02:29:17 2023 +0100
+
+ [func.wrap.func.general, func.wrap.move.class] Remove redundant declaration (#6273)
+
+ We don't need to repeat the declarations of the incomplete primary
+ template, they are already present in the <functional> synopsis.
+
+commit e6bd946d953b76e908a8e853d93834572c125d59
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jul 14 13:31:47 2023 -0700
+
+ [basic.scope.scope] Avoid hard-to-read except...unless construction.
+
+ Factor out a name for the "unless" condition to avoid the double-negative.
+
+commit 3769c701daf9ae38f8db054670106abca7c03d32
+Author: Roger Orr <rogero@howzatt.co.uk>
+Date: Tue Jul 18 23:54:34 2023 +0100
+
+ [dcl.ambig.res] fix double declaration of 'y' in example
+
+commit 0bf51a3bc5c24b070265412c32e53a0060d73eef
+Author: Christian Trott <crtrott@sandia.gov>
+Date: Sat Jul 22 19:33:41 2023 -0600
+
+ [mdspan.layout.stride.cons] Fix missed rename of template parameter (#6385)
+
+ "LayoutStrideMapping" should say "StridedLayoutMapping".
+
+commit f8feaa6e5bc8e6d28e00c06a3de305f80f395913
+Author: Eelis van der Weegen <eelis@eelis.net>
+Date: Fri Jul 21 11:43:39 2023 +0200
+
+ [version.syn] Fix header references.
+
+commit 872bda08678d1aeecfc555f26920cec28a2ad497
+Author: lprv <100177227+lprv@users.noreply.github.com>
+Date: Thu Jun 1 14:59:00 2023 +0000
+
+ [basic.stc.dynamic.allocation] Remove redundant 'address of' from a note
+
+commit 880531fad125c4b806300151ddcb961a7f44a181
+Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
+Date: Sat Jul 22 21:49:38 2023 -0400
+
+ [flat.{,multi}{map,set}.cons]: zip_view should be views::zip (#6373)
+
+ We don't expect to use CTAD on `ranges::zip_view(args...)`;
+ what we expect is `views::zip`.
+
+commit a417ade53722d944481baac575292874c1bcc79a
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Sat Jul 22 21:50:37 2023 -0400
+
+ [range.enumerate.overview] Add cross reference to [range.adaptor.object] (#6219)
+
+commit 7f100cc67b0bb263e2f438238e87555347ae45c0
+Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+Date: Sun Jul 23 17:50:27 2023 +0800
+
+ [input.output] Fix the "Effects: Equivalent to" format (#6402)
+
+commit 9334219bd95a85e86b20c8a712397f9f23f0f7a8
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jul 23 06:59:28 2023 +0200
+
+ [class.copy.assign] Remove note obsoleted by CWG2586
+
+commit 503b4b261061bdd2481e1e4f1153481a0a75ecee
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jul 23 08:29:10 2023 +0200
+
+ [dcl.fct.def.default] Highlight different references in defaulted assignments
+
+commit a567088b0ab8ca62f0ff5a7b4746337ac3f6df9b
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Mon Jul 24 12:45:57 2023 +0100
+
+ [assets] Move separate assets into "assets" subdirectory
+
+commit 7e2cc3ba6a30a693a96bbc37c4d8428d92ce1fa8
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Aug 19 17:03:37 2022 +0100
+
+ [assets] Unicode examples
+
+commit 589af92ce99b91444a3e6155cb64f8009918e885
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Sun Aug 28 02:09:47 2022 +0100
+
+ [format.string.{std,escaped}, macros] Add missing examples
+
+commit f61a2c8a847e846ba1167c876b0fc1532ab433d7
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Mon Jul 24 21:27:00 2023 +0100
+
+ [format.string.escape] Fix mis{sing,escaped} braces
+
+ This was an oversight in the application of
+ https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2713r0.html
+ in e38ea31d46ca2964c4f9169f049e2f15e2cd5957.
+
+commit 3b2a8ee11725eb485df89dec40a7e0fc965debb2
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Fri Jul 21 12:46:48 2023 -0400
+
+ [func.wrap.ref.class] change deduction guide to match its detailed specifications
+
+commit d5160c6ff6c09fc0c52b5b11676c03ff179f4554
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Sun Jul 23 02:51:25 2023 +0100
+
+ [mdspan.submdspan.extents] Factor out common result expression
+
+commit 84cf8ef63a479a3fda05a219dd26ab4b8c6a8e32
+Author: Jakub Mazurkiewicz <mazkuba3@gmail.com>
+Date: Tue Jul 25 01:06:49 2023 +0200
+
+ [mdspan.mdspan.cons] `OtherIndexType` is not a parameter pack; missing _v (#6263)
+
+commit a636f553369825bc37ac0d95c171a00c526af499
+Author: lprv <100177227+lprv@users.noreply.github.com>
+Date: Mon Jul 24 16:16:14 2023 +0000
+
+ [intro.object] Fix cross-references for library implicit object creation
+
+commit d09a77e09a5210c50994b89d999f3cbdfcc9a436
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Wed May 17 18:51:00 2023 +0100
+
+ [re.results.general, string.cons] Fix references to container reqmts
+
+ [re.results.general] should refer to [container.alloc.reqmts] for an
+ allocator-aware container, [strings.cons] should refer to sequence
+ container requirements.
+
+commit dd32b7eeb21e0ca8be7aae1996814a2ffda0ed83
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Thu May 18 12:54:12 2023 +0100
+
+ [container.gen.reqmts] Adjust subclause names and stable tags
+
+ There are no more cross-references to [container.gen.reqmts] or
+ [container.requirements.general], so this doesn't affect anything else.
+
+commit a0e6740cda724c192ea14979e2fa92e9f38cf242
+Author: Janet Cobb <git@randomcat.org>
+Date: Mon Jul 24 12:09:44 2023 -0400
+
+ [basic.fundamental] Clarify that table of minimum integral type widths applies only to standard integral types
+
+commit 3a2586ccb4112f32f08643f7fcafab0b6b7956e2
+Author: Joshua Berne <berne@notadragon.com>
+Date: Fri Jul 28 15:31:51 2023 -0400
+
+ [dcl.attr.grammar] Fix typo "appeartain" -> "appertain" (#6420)
+
+commit 00b4bb25e7b881cc53dca91dd44ef87c9696b19c
+Author: Jan Schultke <me@eisenwave.net>
+Date: Sun Aug 13 22:35:57 2023 +0200
+
+ [over.ics.list] Fix missing std:: in example (#6453)
+
+commit cf7d5820d2ab8352d96462c647b735dc575cc1cb
+Author: Alisdair Meredith <alisdairm@me.com>
+Date: Tue Aug 15 00:12:21 2023 +0200
+
+ [depr.static.constexpr] Cross-reference core clauses for deprecated feature (#6448)
+
+commit 1353359777de653346dd05ed117bba3627b6c7ca
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jan 24 18:51:02 2023 +0100
+
+ [class.mem.general] Clarify class completeness
+
+commit 77d1b66193d5324b121979474d0e35645bbcfb1c
+Author: A. Jiang <de34@live.cn>
+Date: Tue Aug 1 13:39:55 2023 +0800
+
+ [memory.syn] Remove redundant freestanding mark for members
+
+ Making `allocator_arg_t` shown like `from_range_t` in [ranges.syn].
+
+commit bf304328b603d96b9da5dc38dfeb04057c67cc53
+Author: A. Jiang <de34@live.cn>
+Date: Tue Aug 1 13:42:07 2023 +0800
+
+ [ranges.syn] Remove redundant freestanding mark for members
+
+commit d347b328e058bb4b357a2b7b4733c923fca6fd98
+Author: Jan Schultke <me@eisenwave.net>
+Date: Tue Aug 15 00:42:54 2023 +0200
+
+ [temp.over] itemize parts of long paragraph (#6443)
+
+commit e34a8e15e1de7eab0980af328765957c6118fc04
+Author: Jan Schultke <me@eisenwave.net>
+Date: Tue Aug 15 00:45:43 2023 +0200
+
+ [meta.unary.prop] itemize long sentence (#6436)
+
+
+
diff --git a/papers/n4959.md b/papers/n4959.md
new file mode 100644
index 0000000000..a1f6effec6
--- /dev/null
+++ b/papers/n4959.md
@@ -0,0 +1,553 @@
+# N4959 Editors' Report -- Programming Languages -- C++
+
+Date: 2023-08-14
+
+Thomas Köppe (editor, Google DeepMind)
+Jens Maurer (co-editor)
+Dawn Perchik (co-editor, Bright Side Computing, LLC)
+Richard Smith (co-editor, Google Inc)
+
+Email: `cxxeditor@gmail.com`
+
+## Acknowledgements
+
+Thanks to all those who have [submitted editorial
+issues](https://github.com/cplusplus/draft/wiki/How-to-submit-an-editorial-issue)
+and to those who have provided pull requests with fixes,
+and special thanks to Johel Ernesto Guerrero Peña for providing in-depth review
+of many of the draft motion applications.
+
+## New papers
+
+ * [N4958](https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4958.pdf) is the
+ current working draft for C++26. It replaces
+ [N4950](https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4950.pdf).
+ * N4959 is this Editors' Report.
+
+## Motions incorporated into working draft
+
+### Notes on motions
+
+All motions were applied cleanly. In a small number of cases, the approved
+wording was based on an older draft and needed reconciliation with intervening
+changes, but it was clear how to do this.
+
+* The wording for [P1854R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1854r4.pdf)
+ ("Making non-encodable string literals ill-formed", CWG Poll 3)
+ has been reconciled with previous changes from
+ [P2314R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2314r4.html)
+ ("Character sets and encodings").
+* For [P0792R14](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p0792r14.html)
+ ("`function_ref`: a type-erased callable reference", LWG Poll 18),
+ among some minor fixes for correctness and consistency,
+ exposition-only members have been added explicitly to the class synopsis,
+ which had only been mentioned in the descriptive text in the approved wording.
+* The feature test macro `__cpp_lib_format` has been modified three times, as follows:
+ * `202304L` by
+ [P2510R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2510r3.pdf)
+ ("Formatting pointers", LWG Poll 10)
+ * `202305L` by
+ [P2757R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2757r3.html)
+ ("Type checking format args", LWG Poll 20)
+ * `202306L` by
+ [P2637R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2637r3.html)
+ ("Member `visit`", LWG Poll 21)
+* The feature test macro for
+ [P2641R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2641r4.html)
+ ("Checking if a union alternative is active", LWG Poll 22)
+ has been renamed from `__cpp_lib_within_lifetime` to `__cpp_lib_is_within_lifetime`,
+ which seems more appropriate and follows existing practice.
+* For [P2630R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2630r4.html)
+ (`submdspan`, LWG Poll 29), numerous minor editorial corrections and improvements
+ have been applied; see the full commit log for details.
+
+### Core working group polls
+
+CWG Poll 1: Accept as Defect Reports and apply the proposed resolutions of all issues in
+[P2922R0](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2922r0.html)
+(Core Language Working Group "ready" Issues for the June, 2023 meeting) to the C++ Working Paper.
+
+CWG Poll 2: Accept as a Defect Report and apply the changes in
+[P2621R2](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2621r2.pdf)
+(UB? In my Lexer?) to the C++26 Working Paper.
+
+CWG Poll 3: Accept as a Defect Report and apply the changes in
+[P1854R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1854r4.pdf)
+(Making non-encodable string literals ill-formed) to the C++26 Working Paper.
+
+CWG Poll 4: Apply the changes in [P2361R6](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2361r6.pdf)
+(Unevaluated strings) to the C++26 Working Paper.
+
+CWG Poll 5: Apply the changes in [P2558R2](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2558r2.html)
+(Add `@`, `$`, and `
to the basic character set) to the C++26 Working Paper.
+
+CWG Poll 6: Apply the changes in [P2738R1](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2738r1.pdf)
+(constexpr cast from `void*`: towards constexpr type-erasure) to the C++26 Working Paper.
+
+CWG Poll 7: Accept as a Defect Report and apply the changes in
+[P2915R0](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2915r0.pdf)
+(Proposed resolution for CWG1223) to the C++26 Working Paper.
+
+CWG Poll 8: Accept as a Defect Report and apply the changes in
+[P2552R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2552r3.pdf)
+(On the ignorability of standard attributes) to the C++26 Working Paper.
+
+CWG Poll 9: Accept as a Defect Report and apply the changes in
+[P2752R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2752r3.html)
+(Static storage for braced initializers) to the C++26 Working Paper.
+
+CWG Poll 10: Apply the changes in [P2741R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2741r3.pdf)
+(User-generated `static_assert` messages) to the C++26 Working Paper.
+
+CWG Poll 11: Apply the changes in [P2169R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2169r4.pdf)
+(A nice placeholder with no name) to the C++26 Working Paper.
+
+### Library working group polls
+
+LWG Poll 1: Apply the changes for all Tentatively Ready issues in
+[P2910R0](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2910r0.html)
+(C++ Standard Library Issues to be moved in Varna, Jun. 2023) to the C++ working paper.
+
+LWG Poll 2: Apply the changes in [P2497R0](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2497r0.html)
+(Testing for success or failure of `` functions) to the C++ working paper.
+
+LWG Poll 3: Apply the changes in [P2592R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2592r3.html)
+(Hashing support for `std::chrono` value classes) to the C++ working paper.
+
+LWG Poll 4: Apply the changes in [P2587R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2587r3.html)
+(`to_string` or not `to_string`) to the C++ working paper.
+
+LWG Poll 5: Apply the changes in [P2562R1](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2562r1.pdf)
+(`constexpr` Stable Sorting) to the C++ working paper.
+
+LWG Poll 6: Apply the changes in [P2545R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2545r4.pdf)
+(Read-Copy Update (RCU)) to the C++ working paper.
+
+LWG Poll 7: Apply the changes in [P2530R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2530r3.pdf)
+(Hazard Pointers for C++26) to the C++ working paper.
+
+LWG Poll 8: Apply the changes in [P2538R1](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2538r1.html)
+(ADL-proof `std::projected`) to the C++ working paper.
+
+LWG Poll 9: Apply the changes in [P2495R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2495r3.pdf)
+(Interfacing stringstreams with `string_view`) to the C++ working paper.
+
+LWG Poll 10: Apply the changes in [P2510R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2510r3.pdf)
+(Formatting pointers) to the C++ working paper.
+
+LWG Poll 11: Apply the changes in [P2198R7](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2198r7.html)
+(Freestanding Feature-Test Macros and Implementation-Defined Extensions) to the C++ working paper.
+
+LWG Poll 12: Apply the changes in [P2338R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2338r4.html)
+(Freestanding Library: Character primitives and the C library) to the C++ working paper.
+
+LWG Poll 13: Apply the changes in [P2013R5](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2013r5.html)
+(Freestanding Language: Optional `::operator new`) to the C++ working paper.
+
+LWG Poll 14: Apply the changes in [P0493R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p0493r4.pdf)
+(Atomic maximum/minimum) to the C++ working paper.
+
+LWG Poll 15: Apply the changes in [P2363R5](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2363r5.html)
+(Extending associative containers with the remaining heterogeneous overloads) to the C++ working paper.
+
+LWG Poll 16: Apply the changes in [P1901R2](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1901r2.html)
+(Enabling the Use of `weak_ptr` as Keys in Unordered Associative Containers) to the C++ working paper.
+
+LWG Poll 17: Apply the changes in [P1885R12](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1885r12.pdf)
+(Naming Text Encodings to Demystify Them) to the C++ working paper.
+
+LWG Poll 18: Apply the changes in [P0792R14](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p0792r14.html)
+(`function_ref`: a type-erased callable reference) to the C++ working paper.
+
+LWG Poll 19: Apply the changes in [P2874R2](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2874r2.pdf)
+(Mandating Annex D) to the C++ working paper.
+
+LWG Poll 20: Apply the changes in [P2757R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2757r3.html)
+(Type checking format args) to the C++ working paper.
+
+LWG Poll 21: Apply the changes in [P2637R3](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2637r3.html)
+(Member `visit`) to the C++ working paper.
+
+LWG Poll 22: Apply the changes in [P2641R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2641r4.html)
+(Checking if a union alternative is active) to the C++ working paper.
+
+LWG Poll 23: Apply the changes in [P1759R6](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1759r6.html)
+(Native handles and file streams) to the C++ working paper.
+
+LWG Poll 24: Apply the changes in [P2697R1](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2697r1.pdf)
+(Interfacing `bitset` with `string_view`) to the C++ working paper.
+
+LWG Poll 25: Apply the changes in [P1383R2](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1383r2.pdf)
+(More `constexpr` for `` and ``) to the C++ working paper.
+
+LWG Poll 26: Apply the changes in [P2734R0](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2734r0.pdf)
+(Adding the new 2022 SI prefixes) to the C++ working paper.
+
+LWG Poll 27: Apply the changes in [P2548R6](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2548r6.pdf)
+(`copyable_function`) to the C++ working paper.
+
+LWG Poll 28: Apply the changes in [P2714R1](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2714r1.html)
+(Bind front and back to NTTP callables) to the C++ working paper.
+
+LWG Poll 29: Apply the changes in [P2630R4](http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2630r4.html)
+(`submdspan`) to the C++ working paper.
+
+## Editorial changes
+
+### Noteworthy changes
+
+Some Unicode examples of the new formatting facilities had been missing from the
+last few working drafts (but are present in the C++23 DIS) because they needed
+some bespoke handling. This has now been integrated into the main branch, and
+the examples now appear correctly in the working draft. (The examples are
+generated with LuaTeX. As a side effect, the typeface used in existing diagrams
+has been changed to match the one used for the main body text. We have also
+explored switching the typesetting engine for the main document from eTeX to
+LuaTeX. This is possible in principle, but results in slightly lower typographic
+quality at the moment, so we are holding off on this and will revisit this
+change in the future.)
+
+The title of the working draft has been changed to "Working Draft, Programming
+Languages — C++", to match the official title of the standard more closely.
+
+### Minor editorial changes
+
+A log of editorial fixes made to the working draft since N4950 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](https://github.com/cplusplus/draft/compare/n4950...n4958).
+
+ commit abb81facf56f82a7487b3f64ae337ce2802c4bf3
+ Author: Jens Maurer
+ Date: Fri May 12 09:38:16 2023 +0200
+
+ [intro.execution] Fix bad function call in example
+
+ commit 42f21d84fb374b11d44c0b367bda649636128b6a
+ Author: Andrew Rogers
+ Date: Wed Apr 19 01:03:57 2023 +0100
+
+ [dcl.init.aggr] Add missing apostrophe
+
+ commit 4514233a48954d0fd0669236cc986640e33feb04
+ Author: lprv <100177227+lprv@users.noreply.github.com>
+ Date: Fri May 12 23:14:43 2023 +0200
+
+ [basic.compound] Fix cross-reference for 'incomplete type' (#6210)
+
+ commit 4fac9f97a2c25d39a01f75cf198d0783bfa8deda
+ Author: Jonathan Wakely
+ Date: Tue May 16 17:01:51 2023 +0100
+
+ [strings], [unord.req.general], [stringbuf.members]: Fix xrefs to [container.requirements.general]
+
+ All the references for "qualifies as an input iterator" and "qualifies
+ as an allocator" are supposed to be to [container.reqmts] p69 which
+ begins:
+
+ > The behavior of certain container member functions and deduction
+ > guides depends on whether types qualify as input iterators or
+ > allocators.
+
+ The reference in [string.require] for obtaining an allocator should be
+ to [container.reqmts] p64.
+
+ The reference in [string.require] Note 2 should be to
+ [container.requirements.pre] p3.
+
+ Fixes #6184
+
+ commit 1be4801ac1f90aca9a8f5804a48e8bcd082f5bb9
+ Author: lprv <100177227+lprv@users.noreply.github.com>
+ Date: Thu Jun 1 20:57:05 2023 +0200
+
+ [lib] Refer to exposition-only function templates as templates, not functions (#6265)
+
+ * [tuple.apply]/1, /4
+ * [expected.object.assign]/1
+ * [iterator.cust.swap]/2
+ * [specialized.algorithms.general]/3
+
+ commit c0685a584ea51d3e47381478a750729da3202b37
+ Author: Géry Ogam
+ Date: Tue Jun 13 18:21:59 2023 +0200
+
+ [basic.lval] Reword the misused term ‘classifications’ (#4913)
+
+ commit ae4cba4dc8ee2437f39a451268ad6bc924076da0
+ Author: Thomas Köppe
+ Date: Tue Jun 20 13:29:38 2023 +0100
+
+ [cover-wd] A more appropriate title, and better line spacing
+
+ commit 7e7afe0965e4e16ff651167212ea05ed9c0ef788
+ Author: Eisenwave
+ Date: Thu Jul 6 12:45:54 2023 +0200
+
+ [expr.mul] Add missing commas (#6366)
+
+ commit 384d36a0d30e6a8050e23f7193db40fb56ff4f06
+ Author: Jonathan Wakely
+ Date: Thu Jul 6 20:45:10 2023 +0100
+
+ [filebuf.virtuals] fix "if width if less than zero" typo
+
+ commit 964015779245341d64d93bbd0d1e11f050b32e70
+ Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+ Date: Mon Jul 10 18:53:10 2023 +0800
+
+ [time.duration.cons] Fix duplicate definition in example (#6372)
+
+ commit e6c2f8fb0d5ad6cda3e2d3da63bd5d5e434635b4
+ Author: Thomas Köppe
+ Date: Tue Jul 18 23:16:59 2023 +0100
+
+ [diff.cpp23.expr] Fix environment ("example" should be "codeblock")
+
+ commit 2109f579cc6749d19ddf9cf892e8aec4762ba344
+ Author: Thomas Köppe
+ Date: Fri Jul 21 16:21:54 2023 +0100
+
+ [locale.general] Add cross-references to class synopsis
+
+ commit c2e05a4080e8c79bcc9971054ca6fb6ae9b3e722
+ Author: Thomas Köppe
+ Date: Fri Jul 21 17:05:10 2023 +0100
+
+ [functional.syn] Tweak cross-references in class synopsis
+
+ commit 8334cc876d29595f0f2796a6de42acae937d8377
+ Author: Thomas Köppe
+ Date: Fri Jul 21 23:29:54 2023 +0100
+
+ [functional.syn, func.wrap.move] Hyphenate "move-only wrapper"
+
+ commit 7fb62d5f50bfbfc159df4ca0af932ee82d26bc41
+ Author: Thomas Köppe
+ Date: Fri Jul 21 18:13:28 2023 +0100
+
+ [version.syn] Rename smart_pointer_owner_equality to smart_ptr_owner_equality
+
+ For consistency: the use of "ptr" is already prevailing.
+
+ commit 56a6b7fe068726ace9196366c968cc679653cc04
+ Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+ Date: Wed May 17 23:27:22 2023 +0800
+
+ Add missing colon for the Effects: Equivalent to return format
+
+ commit a34d2e08bda9b1314ecec1b608745a88a678d664
+ Author: vasama
+ Date: Wed Jun 7 11:01:02 2023 +0300
+
+ [expr.pre] Clarify note on pointer subtraction
+
+ commit 96f695aea7589a62e5ebb55a18a40f985f7d89ce
+ Author: Thomas Köppe
+ Date: Tue Jun 13 09:18:01 2023 +0300
+
+ [basic.def.odr] Restructure requirements in p14-p15
+
+ commit ebba9f316ddd8c120608447b00ea32bf3926a18d
+ Author: Jonathan Wakely
+ Date: Sun Jul 23 02:29:17 2023 +0100
+
+ [func.wrap.func.general, func.wrap.move.class] Remove redundant declaration (#6273)
+
+ We don't need to repeat the declarations of the incomplete primary
+ template, they are already present in the synopsis.
+
+ commit e6bd946d953b76e908a8e853d93834572c125d59
+ Author: Richard Smith
+ Date: Fri Jul 14 13:31:47 2023 -0700
+
+ [basic.scope.scope] Avoid hard-to-read except...unless construction.
+
+ Factor out a name for the "unless" condition to avoid the double-negative.
+
+ commit 3769c701daf9ae38f8db054670106abca7c03d32
+ Author: Roger Orr
+ Date: Tue Jul 18 23:54:34 2023 +0100
+
+ [dcl.ambig.res] fix double declaration of 'y' in example
+
+ commit 0bf51a3bc5c24b070265412c32e53a0060d73eef
+ Author: Christian Trott
+ Date: Sat Jul 22 19:33:41 2023 -0600
+
+ [mdspan.layout.stride.cons] Fix missed rename of template parameter (#6385)
+
+ "LayoutStrideMapping" should say "StridedLayoutMapping".
+
+ commit f8feaa6e5bc8e6d28e00c06a3de305f80f395913
+ Author: Eelis van der Weegen
+ Date: Fri Jul 21 11:43:39 2023 +0200
+
+ [version.syn] Fix header references.
+
+ commit 872bda08678d1aeecfc555f26920cec28a2ad497
+ Author: lprv <100177227+lprv@users.noreply.github.com>
+ Date: Thu Jun 1 14:59:00 2023 +0000
+
+ [basic.stc.dynamic.allocation] Remove redundant 'address of' from a note
+
+ commit 880531fad125c4b806300151ddcb961a7f44a181
+ Author: Arthur O'Dwyer
+ Date: Sat Jul 22 21:49:38 2023 -0400
+
+ [flat.{,multi}{map,set}.cons]: zip_view should be views::zip (#6373)
+
+ We don't expect to use CTAD on `ranges::zip_view(args...)`;
+ what we expect is `views::zip`.
+
+ commit a417ade53722d944481baac575292874c1bcc79a
+ Author: Johel Ernesto Guerrero Peña
+ Date: Sat Jul 22 21:50:37 2023 -0400
+
+ [range.enumerate.overview] Add cross reference to [range.adaptor.object] (#6219)
+
+ commit 7f100cc67b0bb263e2f438238e87555347ae45c0
+ Author: Hewill Kang <67143766+hewillk@users.noreply.github.com>
+ Date: Sun Jul 23 17:50:27 2023 +0800
+
+ [input.output] Fix the "Effects: Equivalent to" format (#6402)
+
+ commit 9334219bd95a85e86b20c8a712397f9f23f0f7a8
+ Author: Jens Maurer
+ Date: Sun Jul 23 06:59:28 2023 +0200
+
+ [class.copy.assign] Remove note obsoleted by CWG2586
+
+ commit 503b4b261061bdd2481e1e4f1153481a0a75ecee
+ Author: Jens Maurer
+ Date: Sun Jul 23 08:29:10 2023 +0200
+
+ [dcl.fct.def.default] Highlight different references in defaulted assignments
+
+ commit a567088b0ab8ca62f0ff5a7b4746337ac3f6df9b
+ Author: Thomas Köppe
+ Date: Mon Jul 24 12:45:57 2023 +0100
+
+ [assets] Move separate assets into "assets" subdirectory
+
+ commit 7e2cc3ba6a30a693a96bbc37c4d8428d92ce1fa8
+ Author: Thomas Köppe
+ Date: Fri Aug 19 17:03:37 2022 +0100
+
+ [assets] Unicode examples
+
+ commit 589af92ce99b91444a3e6155cb64f8009918e885
+ Author: Thomas Köppe
+ Date: Sun Aug 28 02:09:47 2022 +0100
+
+ [format.string.{std,escaped}, macros] Add missing examples
+
+ commit f61a2c8a847e846ba1167c876b0fc1532ab433d7
+ Author: Thomas Köppe
+ Date: Mon Jul 24 21:27:00 2023 +0100
+
+ [format.string.escape] Fix mis{sing,escaped} braces
+
+ This was an oversight in the application of
+ https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2713r0.html
+ in e38ea31d46ca2964c4f9169f049e2f15e2cd5957.
+
+ commit 3b2a8ee11725eb485df89dec40a7e0fc965debb2
+ Author: Johel Ernesto Guerrero Peña
+ Date: Fri Jul 21 12:46:48 2023 -0400
+
+ [func.wrap.ref.class] change deduction guide to match its detailed specifications
+
+ commit d5160c6ff6c09fc0c52b5b11676c03ff179f4554
+ Author: Thomas Köppe
+ Date: Sun Jul 23 02:51:25 2023 +0100
+
+ [mdspan.submdspan.extents] Factor out common result expression
+
+ commit 84cf8ef63a479a3fda05a219dd26ab4b8c6a8e32
+ Author: Jakub Mazurkiewicz
+ Date: Tue Jul 25 01:06:49 2023 +0200
+
+ [mdspan.mdspan.cons] `OtherIndexType` is not a parameter pack; missing _v (#6263)
+
+ commit a636f553369825bc37ac0d95c171a00c526af499
+ Author: lprv <100177227+lprv@users.noreply.github.com>
+ Date: Mon Jul 24 16:16:14 2023 +0000
+
+ [intro.object] Fix cross-references for library implicit object creation
+
+ commit d09a77e09a5210c50994b89d999f3cbdfcc9a436
+ Author: Jonathan Wakely
+ Date: Wed May 17 18:51:00 2023 +0100
+
+ [re.results.general, string.cons] Fix references to container reqmts
+
+ [re.results.general] should refer to [container.alloc.reqmts] for an
+ allocator-aware container, [strings.cons] should refer to sequence
+ container requirements.
+
+ commit dd32b7eeb21e0ca8be7aae1996814a2ffda0ed83
+ Author: Jonathan Wakely
+ Date: Thu May 18 12:54:12 2023 +0100
+
+ [container.gen.reqmts] Adjust subclause names and stable tags
+
+ There are no more cross-references to [container.gen.reqmts] or
+ [container.requirements.general], so this doesn't affect anything else.
+
+ commit a0e6740cda724c192ea14979e2fa92e9f38cf242
+ Author: Janet Cobb
+ Date: Mon Jul 24 12:09:44 2023 -0400
+
+ [basic.fundamental] Clarify that table of minimum integral type widths applies only to standard integral types
+
+ commit 3a2586ccb4112f32f08643f7fcafab0b6b7956e2
+ Author: Joshua Berne
+ Date: Fri Jul 28 15:31:51 2023 -0400
+
+ [dcl.attr.grammar] Fix typo "appeartain" -> "appertain" (#6420)
+
+ commit 00b4bb25e7b881cc53dca91dd44ef87c9696b19c
+ Author: Jan Schultke
+ Date: Sun Aug 13 22:35:57 2023 +0200
+
+ [over.ics.list] Fix missing std:: in example (#6453)
+
+ commit cf7d5820d2ab8352d96462c647b735dc575cc1cb
+ Author: Alisdair Meredith
+ Date: Tue Aug 15 00:12:21 2023 +0200
+
+ [depr.static.constexpr] Cross-reference core clauses for deprecated feature (#6448)
+
+ commit 1353359777de653346dd05ed117bba3627b6c7ca
+ Author: Jens Maurer
+ Date: Tue Jan 24 18:51:02 2023 +0100
+
+ [class.mem.general] Clarify class completeness
+
+ commit 77d1b66193d5324b121979474d0e35645bbcfb1c
+ Author: A. Jiang
+ Date: Tue Aug 1 13:39:55 2023 +0800
+
+ [memory.syn] Remove redundant freestanding mark for members
+
+ Making `allocator_arg_t` shown like `from_range_t` in [ranges.syn].
+
+ commit bf304328b603d96b9da5dc38dfeb04057c67cc53
+ Author: A. Jiang
+ Date: Tue Aug 1 13:42:07 2023 +0800
+
+ [ranges.syn] Remove redundant freestanding mark for members
+
+ commit d347b328e058bb4b357a2b7b4733c923fca6fd98
+ Author: Jan Schultke
+ Date: Tue Aug 15 00:42:54 2023 +0200
+
+ [temp.over] itemize parts of long paragraph (#6443)
+
+ commit e34a8e15e1de7eab0980af328765957c6118fc04
+ Author: Jan Schultke
+ Date: Tue Aug 15 00:45:43 2023 +0200
+
+ [meta.unary.prop] itemize long sentence (#6436)
diff --git a/papers/wd-index.md b/papers/wd-index.md
index abcbe32842..df0daff8e8 100644
--- a/papers/wd-index.md
+++ b/papers/wd-index.md
@@ -45,3 +45,4 @@
* [N4928](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4928.pdf) 2022-11 C++ Working Draft
* [N4944](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4944.pdf) 2023-02 C++ Working Draft
* [N4950](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4950.pdf) 2023-05 C++ Working Draft
+ * [N4958](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/n4958.pdf) 2023-08 C++ Working Draft
diff --git a/source/Makefile b/source/Makefile
index 02f990cd01..d4a2ff4064 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -1,4 +1,5 @@
-FIGURES=$(patsubst %.dot,%.pdf,$(wildcard *.dot))
+FIGURES=$(patsubst %.dot,%.pdf,$(wildcard assets/*.dot))
+EXAMPLES=$(patsubst %.tex,%.pdf,$(wildcard assets/*.tex))
default: full
@@ -15,9 +16,17 @@ quiet:
latexmk -pdf std -e '$$max_repeat = 1;' -silent || ( rm std.pdf; latexmk -pdf std -e '$$max_repeat = 4;' )
%.pdf: %.dot
- dot -o $@ -Tpdf $<
+ dot -o $@ -Tpdf $< -Nfontname=NewComputerModernSans10
clean-figures:
rm -f $(FIGURES)
figures: $(FIGURES)
+
+%.pdf: %.tex
+ lualatex -output-directory assets $<
+
+clean-examples:
+ rm -f $(EXAMPLES)
+
+examples: $(EXAMPLES)
diff --git a/source/algorithms.tex b/source/algorithms.tex
index ed1d8d1cf0..b583ba13af 100644
--- a/source/algorithms.tex
+++ b/source/algorithms.tex
@@ -2011,9 +2011,9 @@
}
template
- void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
+ constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
template
- void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
+ constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
template
void stable_sort(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
@@ -2027,10 +2027,10 @@
template<@\libconcept{random_access_iterator}@ I, @\libconcept{sentinel_for}@ S, class Comp = ranges::less,
class Proj = identity>
requires @\libconcept{sortable}@
- I stable_sort(I first, S last, Comp comp = {}, Proj proj = {});
+ constexpr I stable_sort(I first, S last, Comp comp = {}, Proj proj = {});
template<@\libconcept{random_access_range}@ R, class Comp = ranges::less, class Proj = identity>
requires @\libconcept{sortable}@, Comp, Proj>
- borrowed_iterator_t
+ constexpr borrowed_iterator_t
stable_sort(R&& r, Comp comp = {}, Proj proj = {});
}
@@ -2311,9 +2311,9 @@
}
template
- BidirectionalIterator stable_partition(BidirectionalIterator first,
- BidirectionalIterator last,
- Predicate pred);
+ constexpr BidirectionalIterator stable_partition(BidirectionalIterator first,
+ BidirectionalIterator last,
+ Predicate pred);
template
BidirectionalIterator stable_partition(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
BidirectionalIterator first,
@@ -2324,11 +2324,11 @@
template<@\libconcept{bidirectional_iterator}@ I, @\libconcept{sentinel_for}@ S, class Proj = identity,
@\libconcept{indirect_unary_predicate}@> Pred>
requires @\libconcept{permutable}@
- subrange stable_partition(I first, S last, Pred pred, Proj proj = {});
+ constexpr subrange stable_partition(I first, S last, Pred pred, Proj proj = {});
template<@\libconcept{bidirectional_range}@ R, class Proj = identity,
@\libconcept{indirect_unary_predicate}@, Proj>> Pred>
requires @\libconcept{permutable}@>
- borrowed_subrange_t stable_partition(R&& r, Pred pred, Proj proj = {});
+ constexpr borrowed_subrange_t stable_partition(R&& r, Pred pred, Proj proj = {});
}
template
- void inplace_merge(BidirectionalIterator first,
- BidirectionalIterator middle,
- BidirectionalIterator last);
+ constexpr void inplace_merge(BidirectionalIterator first,
+ BidirectionalIterator middle,
+ BidirectionalIterator last);
template
- void inplace_merge(BidirectionalIterator first,
- BidirectionalIterator middle,
- BidirectionalIterator last, Compare comp);
+ constexpr void inplace_merge(BidirectionalIterator first,
+ BidirectionalIterator middle,
+ BidirectionalIterator last, Compare comp);
template
void inplace_merge(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
BidirectionalIterator first,
@@ -2449,10 +2449,10 @@
template<@\libconcept{bidirectional_iterator}@ I, @\libconcept{sentinel_for}@ S, class Comp = ranges::less,
class Proj = identity>
requires @\libconcept{sortable}@
- I inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {});
+ constexpr I inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {});
template<@\libconcept{bidirectional_range}@ R, class Comp = ranges::less, class Proj = identity>
requires @\libconcept{sortable}@, Comp, Proj>
- borrowed_iterator_t
+ constexpr borrowed_iterator_t
inplace_merge(R&& r, iterator_t middle, Comp comp = {},
Proj proj = {});
}
@@ -6714,14 +6714,14 @@
\indexlibraryglobal{stable_sort}%
\begin{itemdecl}
template
- void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
+ constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
template
void stable_sort(ExecutionPolicy&& exec,
RandomAccessIterator first, RandomAccessIterator last);
template
- void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
- Compare comp);
+ constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
+ Compare comp);
template
void stable_sort(ExecutionPolicy&& exec,
RandomAccessIterator first, RandomAccessIterator last,
@@ -6730,10 +6730,10 @@
template<@\libconcept{random_access_iterator}@ I, @\libconcept{sentinel_for}@ S, class Comp = ranges::less,
class Proj = identity>
requires @\libconcept{sortable}@
- I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {});
+ constexpr I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {});
template<@\libconcept{random_access_range}@ R, class Comp = ranges::less, class Proj = identity>
requires @\libconcept{sortable}@, Comp, Proj>
- borrowed_iterator_t
+ constexpr borrowed_iterator_t
ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {});
\end{itemdecl}
@@ -7512,7 +7512,8 @@
\begin{itemdecl}
template
BidirectionalIterator
- stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred);
+ constexpr stable_partition(BidirectionalIterator first, BidirectionalIterator last,
+ Predicate pred);
template
BidirectionalIterator
stable_partition(ExecutionPolicy&& exec,
@@ -7521,11 +7522,11 @@
template<@\libconcept{bidirectional_iterator}@ I, @\libconcept{sentinel_for}@ S, class Proj = identity,
@\libconcept{indirect_unary_predicate}@> Pred>
requires @\libconcept{permutable}@
- subrange ranges::stable_partition(I first, S last, Pred pred, Proj proj = {});
+ constexpr subrange ranges::stable_partition(I first, S last, Pred pred, Proj proj = {});
template<@\libconcept{bidirectional_range}@ R, class Proj = identity,
@\libconcept{indirect_unary_predicate}@, Proj>> Pred>
requires @\libconcept{permutable}@>
- borrowed_subrange_t ranges::stable_partition(R&& r, Pred pred, Proj proj = {});
+ constexpr borrowed_subrange_t ranges::stable_partition(R&& r, Pred pred, Proj proj = {});
\end{itemdecl}
\begin{itemdescr}
@@ -7792,9 +7793,9 @@
\indexlibraryglobal{inplace_merge}%
\begin{itemdecl}
template
- void inplace_merge(BidirectionalIterator first,
- BidirectionalIterator middle,
- BidirectionalIterator last);
+ constexpr void inplace_merge(BidirectionalIterator first,
+ BidirectionalIterator middle,
+ BidirectionalIterator last);
template
void inplace_merge(ExecutionPolicy&& exec,
BidirectionalIterator first,
@@ -7802,9 +7803,9 @@
BidirectionalIterator last);
template
- void inplace_merge(BidirectionalIterator first,
- BidirectionalIterator middle,
- BidirectionalIterator last, Compare comp);
+ constexpr void inplace_merge(BidirectionalIterator first,
+ BidirectionalIterator middle,
+ BidirectionalIterator last, Compare comp);
template
void inplace_merge(ExecutionPolicy&& exec,
BidirectionalIterator first,
@@ -7814,7 +7815,7 @@
template<@\libconcept{bidirectional_iterator}@ I, @\libconcept{sentinel_for}@ S, class Comp = ranges::less,
class Proj = identity>
requires @\libconcept{sortable}@
- I ranges::inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {});
+ constexpr I ranges::inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {});
\end{itemdecl}
\begin{itemdescr}
@@ -7865,7 +7866,7 @@
\begin{itemdecl}
template<@\libconcept{bidirectional_range}@ R, class Comp = ranges::less, class Proj = identity>
requires @\libconcept{sortable}@, Comp, Proj>
- borrowed_iterator_t
+ constexpr borrowed_iterator_t
ranges::inplace_merge(R&& r, iterator_t middle, Comp comp = {}, Proj proj = {});
\end{itemdecl}
@@ -10768,7 +10769,8 @@
before allowing the exception to propagate.
\pnum
-Some algorithms specified in \ref{specialized.algorithms} make use of the exposition-only function
+Some algorithms specified in \ref{specialized.algorithms}
+make use of the exposition-only function template
\tcode{\placeholdernc{voidify}}:
\begin{codeblock}
template
diff --git a/source/assets/example_01.pdf b/source/assets/example_01.pdf
new file mode 100644
index 0000000000..2d4c06ffe4
Binary files /dev/null and b/source/assets/example_01.pdf differ
diff --git a/source/assets/example_01.tex b/source/assets/example_01.tex
new file mode 100644
index 0000000000..ffda6ec746
--- /dev/null
+++ b/source/assets/example_01.tex
@@ -0,0 +1,14 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\newfontfamily\notoemoji{Noto Color Emoji}[Renderer=HarfBuzz]
+
+\newcommand{\emo}[1]{{\notoemoji\raisebox{1pt}{\scriptsize #1}}}
+
+\begin{document}
+\texttt{Спасибо, Виктор \emo{♥}!}
+\end{document}
diff --git a/source/assets/example_02.pdf b/source/assets/example_02.pdf
new file mode 100644
index 0000000000..65a9fb12f9
Binary files /dev/null and b/source/assets/example_02.pdf differ
diff --git a/source/assets/example_02.tex b/source/assets/example_02.tex
new file mode 100644
index 0000000000..0b48a5aacc
--- /dev/null
+++ b/source/assets/example_02.tex
@@ -0,0 +1,14 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\newfontfamily\notoemoji{Noto Color Emoji}[Renderer=HarfBuzz]
+
+\newcommand{\emo}[1]{{\notoemoji\scriptsize #1}}
+
+\begin{document}
+\emo{🤷🏻♂️}
+\end{document}
diff --git a/source/assets/example_03.pdf b/source/assets/example_03.pdf
new file mode 100644
index 0000000000..74f7bd263c
Binary files /dev/null and b/source/assets/example_03.pdf differ
diff --git a/source/assets/example_03.tex b/source/assets/example_03.tex
new file mode 100644
index 0000000000..17479d4b6d
--- /dev/null
+++ b/source/assets/example_03.tex
@@ -0,0 +1,14 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\newfontfamily\notoemoji{Noto Color Emoji}[Renderer=HarfBuzz]
+
+\newcommand{\emo}[1]{{\notoemoji\scriptsize #1}}
+
+\begin{document}
+\emo{🤷}
+\end{document}
diff --git a/source/assets/example_04.pdf b/source/assets/example_04.pdf
new file mode 100644
index 0000000000..b02c6214d2
Binary files /dev/null and b/source/assets/example_04.pdf differ
diff --git a/source/assets/example_04.tex b/source/assets/example_04.tex
new file mode 100644
index 0000000000..414cdf0822
--- /dev/null
+++ b/source/assets/example_04.tex
@@ -0,0 +1,14 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\newfontfamily\notoemoji{Noto Color Emoji}[Renderer=HarfBuzz]
+
+\newcommand{\emo}[1]{{\notoemoji\scriptsize #1}}
+
+\begin{document}
+\emo{♂}
+\end{document}
diff --git a/source/assets/example_05.pdf b/source/assets/example_05.pdf
new file mode 100644
index 0000000000..047d45a9b3
Binary files /dev/null and b/source/assets/example_05.pdf differ
diff --git a/source/assets/example_05.tex b/source/assets/example_05.tex
new file mode 100644
index 0000000000..109eb45f3f
--- /dev/null
+++ b/source/assets/example_05.tex
@@ -0,0 +1,14 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\newfontfamily\notoemoji{Noto Color Emoji}[Renderer=HarfBuzz]
+
+\newcommand{\emo}[1]{{\notoemoji\scriptsize #1}}
+
+\begin{document}
+\emo{🤡}
+\end{document}
diff --git a/source/assets/example_06.pdf b/source/assets/example_06.pdf
new file mode 100644
index 0000000000..5d8f5392da
Binary files /dev/null and b/source/assets/example_06.pdf differ
diff --git a/source/assets/example_06.tex b/source/assets/example_06.tex
new file mode 100644
index 0000000000..f63b99cc89
--- /dev/null
+++ b/source/assets/example_06.tex
@@ -0,0 +1,10 @@
+\documentclass[9pt]{standalone}
+
+\usepackage{fontspec}
+
+\setmainfont{NewCM10-Regular}
+\setmonofont{NewCMMono10-Regular}
+
+\begin{document}
+\texttt{ẹ́}
+\end{document}
diff --git a/source/figdag.dot b/source/assets/figdag.dot
similarity index 100%
rename from source/figdag.dot
rename to source/assets/figdag.dot
diff --git a/source/assets/figdag.pdf b/source/assets/figdag.pdf
new file mode 100644
index 0000000000..26c743ece5
Binary files /dev/null and b/source/assets/figdag.pdf differ
diff --git a/source/figname.dot b/source/assets/figname.dot
similarity index 100%
rename from source/figname.dot
rename to source/assets/figname.dot
diff --git a/source/assets/figname.pdf b/source/assets/figname.pdf
new file mode 100644
index 0000000000..a7f5bd30c0
Binary files /dev/null and b/source/assets/figname.pdf differ
diff --git a/source/fignonvirt.dot b/source/assets/fignonvirt.dot
similarity index 100%
rename from source/fignonvirt.dot
rename to source/assets/fignonvirt.dot
diff --git a/source/assets/fignonvirt.pdf b/source/assets/fignonvirt.pdf
new file mode 100644
index 0000000000..302424c78a
Binary files /dev/null and b/source/assets/fignonvirt.pdf differ
diff --git a/source/figvirt.dot b/source/assets/figvirt.dot
similarity index 100%
rename from source/figvirt.dot
rename to source/assets/figvirt.dot
diff --git a/source/assets/figvirt.pdf b/source/assets/figvirt.pdf
new file mode 100644
index 0000000000..ddbbeb3176
Binary files /dev/null and b/source/assets/figvirt.pdf differ
diff --git a/source/figvirtnonvirt.dot b/source/assets/figvirtnonvirt.dot
similarity index 100%
rename from source/figvirtnonvirt.dot
rename to source/assets/figvirtnonvirt.dot
diff --git a/source/assets/figvirtnonvirt.pdf b/source/assets/figvirtnonvirt.pdf
new file mode 100644
index 0000000000..5591593dc5
Binary files /dev/null and b/source/assets/figvirtnonvirt.pdf differ
diff --git a/source/valuecategories.dot b/source/assets/valuecategories.dot
similarity index 100%
rename from source/valuecategories.dot
rename to source/assets/valuecategories.dot
diff --git a/source/assets/valuecategories.pdf b/source/assets/valuecategories.pdf
new file mode 100644
index 0000000000..3cff95520a
Binary files /dev/null and b/source/assets/valuecategories.pdf differ
diff --git a/source/back.tex b/source/back.tex
index 055fb32146..1107b0c2b4 100644
--- a/source/back.tex
+++ b/source/back.tex
@@ -18,9 +18,17 @@ \chapter{Bibliography}
Programming languages, their environments, and system software interfaces ---
Floating-point extensions for C --- Part 3: Interchange and extended types}
% Other international standards.
+\item
+ IANA Character Sets Database.
+ Available from:\newline
+ \url{https://www.iana.org/assignments/character-sets/}, 2021-04-01
\item
IANA Time Zone Database.
Available from: \url{https://www.iana.org/time-zones}
+\item
+ Unicode Character Mapping Markup Language [online].
+ Edited by Mark Davis and Markus Scherer. Revision 5.0.1; 2017-05-31
+ Available from: \url{http://www.unicode.org/reports/tr22/tr22-8.html}
% Literature references.
\item
Bjarne Stroustrup,
@@ -57,9 +65,9 @@ \chapter{Bibliography}
\clearpage
\input{xrefdelta}
-\renewcommand{\glossaryname}{Cross-references from ISO \CppXX{}}
+\renewcommand{\glossaryname}{Cross-references from ISO \CppXXIII{}}
\renewcommand{\preglossaryhook}{All clause and subclause labels from
-ISO \CppXX{} (ISO/IEC 14882:2020, \doccite{Programming Languages --- \Cpp{}})
+ISO \CppXXIII{} (ISO/IEC 14882:2023, \doccite{Programming Languages --- \Cpp{}})
are present in this document, with the exceptions described below.\\}
\renewcommand{\leftmark}{\glossaryname}
{
diff --git a/source/basic.tex b/source/basic.tex
index cb8225617f..62ae3796ac 100644
--- a/source/basic.tex
+++ b/source/basic.tex
@@ -182,7 +182,7 @@
\item
it declares a static data member outside a class definition
and the variable was defined within the class with the \keyword{constexpr}
-specifier (this usage is deprecated; see \ref{depr.static.constexpr}),
+specifier\iref{class.static.data} (this usage is deprecated; see \ref{depr.static.constexpr}),
\item
\indextext{declaration!class name}%
it is an \grammarterm{elaborated-type-specifier}\iref{class.name},
@@ -698,7 +698,12 @@
were present in the definition of \tcode{D};
that is, the default argument or default template argument
is subject to the requirements described in this paragraph (recursively).
+\end{itemize}
+
+\pnum
+For the purposes of the preceding requirements:
+\begin{itemize}
\item If \tcode{D} is a class with an implicitly-declared
constructor\iref{class.default.ctor,class.copy.ctor},
it is as if the constructor was
@@ -738,14 +743,16 @@
implicitly defined in every translation unit where it is odr-used, and the
implicit definition in every translation unit shall call the same
comparison operators for each subobject of \tcode{D}.
-\end{itemize}
-\pnum
+\item
If \tcode{D} is a template and is defined in more than one
-translation unit, then the preceding requirements
-shall apply both to names from the template's enclosing scope used in the
+translation unit, the requirements
+apply both to names from the template's enclosing scope used in the
template definition, and also to dependent names at
the point of instantiation\iref{temp.dep}.
+\end{itemize}
+
+\pnum
These requirements also apply to corresponding entities
defined within each definition of \tcode{D}
(including the closure types of \grammarterm{lambda-expression}{s},
@@ -931,7 +938,11 @@
function, or
function template, or
\item
-each declares a function or function template, except when
+each declares a function or function template
+and they do not declare corresponding overloads.
+\end{itemize}
+Two function or function template declarations declare
+\defn{corresponding overloads} if:
\begin{itemize}
\item
both declare functions with the same non-object-parameter-type-list,
@@ -948,7 +959,6 @@
\grammarterm{template-head}s and
trailing \grammarterm{requires-clause}s (if any).
\end{itemize}
-\end{itemize}
\begin{note}
Declarations can correspond even if neither binds a name.
\begin{example}
@@ -987,14 +997,32 @@
\end{codeblock}
\end{example}
+\pnum
+A declaration is \defnx{name-independent}{declaration!name-independent}
+if its name is \tcode{_} (\unicode{005f}{low line}) and it declares
+a variable with automatic storage duration,
+a structured binding not inhabiting a namespace scope,
+the variable introduced by an \grammarterm{init-capture}, or
+a non-static data member.
+
+\recommended
+Implementations should not emit a warning
+that a name-independent declaration is used or unused.
+
\pnum
\indextext{declaration!potentially conflict}%
Two declarations \defn{potentially conflict}
if they correspond and
cause their shared name to denote different entities\iref{basic.link}.
The program is ill-formed
-if, in any scope, a name is bound to two declarations
-that potentially conflict and one precedes the other\iref{basic.lookup}.
+if, in any scope, a name is bound to two declarations $A$ and $B$
+that potentially conflict and $A$ precedes $B$\iref{basic.lookup},
+unless $B$ is name-independent.
+\begin{note}
+An \grammarterm{id-expression} that names a unique name-independent declaration
+is usable until an additional declaration of the same name
+is introduced in the same scope\iref{basic.lookup.general}.
+\end{note}
\begin{note}
Overload resolution can consider potentially conflicting declarations
found in multiple scopes
@@ -1015,6 +1043,18 @@
namespace B = B; // OK, no effect
namespace A = B; // OK, no effect
namespace B {} // error: different entity for \tcode{B}
+
+void g() {
+ int _;
+ _ = 0; // OK
+ int _; // OK, name-independent declaration
+ _ = 0; // error: two non-function declarations in the lookup set
+}
+void h () {
+ int _; // \#1
+ _ ++; // OK
+ static int _; // error: conflicts with \#1 because static variables are not name-independent
+}
\end{codeblock}
\end{example}
@@ -1236,7 +1276,9 @@
\end{example}
\pnum
-If a declaration whose target scope is the block scope $S$ of a
+If a declaration
+that is not a name-independent declaration and
+whose target scope is the block scope $S$ of a
\begin{itemize}
\item
\grammarterm{compound-statement} of a \grammarterm{lambda-expression},
@@ -2728,6 +2770,7 @@
for linkage purposes, if any\iref{dcl.typedef,dcl.enum},
they correspond\iref{basic.scope.scope},
have the same target scope that is not a function or template parameter scope,
+neither is a name-independent declaration,
and either
\begin{itemize}
\item
@@ -3350,7 +3393,7 @@
returns a pointer to a suitable created object.
\begin{note}
Some functions in the \Cpp{} standard library implicitly create objects%
-\iref{obj.lifetime,allocator.traits.members,c.malloc,cstring.syn,bit.cast}.
+\iref{obj.lifetime,c.malloc,mem.res.public,bit.cast,cstring.syn}.
\end{note}
\indextext{object model|)}
@@ -3384,6 +3427,21 @@
\item the storage which the object occupies is released,
or is reused by an object that is not nested within \placeholder{o}\iref{intro.object}.
\end{itemize}
+When evaluating a \grammarterm{new-expression},
+storage is considered reused after it is returned from the allocation function,
+but before the evaluation of the \grammarterm{new-initializer}\iref{expr.new}.
+\begin{example}
+\begin{codeblock}
+struct S {
+ int m;
+};
+
+void f() {
+ S x{1};
+ new(&x) S(x.m); // undefined behavior
+}
+\end{codeblock}
+\end{example}
\pnum
\indextext{reference lifetime}%
@@ -3988,7 +4046,7 @@
currently installed new-handler function\iref{new.handler}, if any.
\begin{note}
\indextext{\idxcode{new_handler}}%
-A program-supplied allocation function can obtain the address of the
+A program-supplied allocation function can obtain the
currently installed \tcode{new_handler} using the
\tcode{std::get_new_handler} function\iref{get.new.handler}.
\end{note}
@@ -4103,6 +4161,9 @@
at which a given object can be allocated. An object type imposes an alignment
requirement on every object of that type; stricter alignment can be requested
using the alignment specifier\iref{dcl.align}.
+Attempting to create an object\iref{intro.object} in storage that
+does not meet the alignment requirements of the object's type
+is undefined behavior.
\pnum
A \defnadj{fundamental}{alignment} is represented by an alignment
@@ -4637,15 +4698,28 @@
\pnum
\label{term.object.representation}%
The \defnx{object representation}{representation!object}
-of an object of type \tcode{T} is the
+of a complete object type \tcode{T} is the
sequence of \placeholder{N} \tcode{\keyword{unsigned} \keyword{char}} objects taken up
-by the object of type \tcode{T}, where \placeholder{N} equals
+by a non-bit-field complete object of type \tcode{T},
+where \placeholder{N} equals
\tcode{\keyword{sizeof}(T)}.
The \defnx{value representation}{representation!value}
-of an object of type \tcode{T} is the set of bits
+of a type \tcode{T} is the set of bits
+in the object representation of \tcode{T}
that participate in representing a value of type \tcode{T}.
+The object and value representation of
+a non-bit-field complete object of type \tcode{T} are
+the bytes and bits, respectively, of
+the object corresponding to the object and value representation of its type.
+The object representation of a bit-field object is
+the sequence of \placeholder{N} bits taken up by the object,
+where \placeholder{N} is the width of the bit-field\iref{class.bit}.
+The value representation of a bit-field object is
+the set of bits in the object representation that
+participate in representing its value.
\label{term.padding.bits}%
-Bits in the object representation that are not part of the value representation
+Bits in the object representation of a type or object that are
+not part of the value representation
are \defn{padding bits}.
For trivially copyable types, the value representation is
a set of bits in the object representation that determines a
@@ -4896,7 +4970,7 @@
\end{floattable}
\pnum
-The width of each signed integer type
+The width of each standard signed integer type
shall not be less than the values specified in \tref{basic.fundamental.width}.
The value representation of a signed or unsigned integer type
comprises $N$ bits, where N is the respective width.
@@ -5058,6 +5132,22 @@
the object and value representations and accuracy of operations
of floating-point types are \impldef{representation of floating-point types}.
+\pnum
+The minimum range of representable values for a floating-point type is
+the most negative finite floating-point number representable
+in that type through
+the most positive finite floating-point number representable in that type.
+In addition, if negative infinity is representable in a type,
+the range of that type is extended to all negative real numbers;
+likewise, if positive infinity is representable in a type,
+the range of that type is extended to all positive real numbers.
+\begin{note}
+Since negative and positive infinity are representable
+in ISO/IEC/IEEE 60559 formats,
+all real numbers lie within the range of representable values of
+a floating-point type adhering to ISO/IEC/IEEE 60559.
+\end{note}
+
\pnum
Integral and floating-point types are collectively
termed \defnx{arithmetic types}{type!arithmetic}.
@@ -5265,7 +5355,7 @@
Except for pointers to static members, text referring to ``pointers''
does not apply to pointers to members. Pointers to incomplete types are
allowed although there are restrictions on what can be done with
-them\iref{basic.align}.
+them\iref{basic.types.general}.
\indextext{address}%
Every value of pointer type is one of the following:
\begin{itemize}
@@ -5716,7 +5806,7 @@
if (S(3).v()) // full-expression includes lvalue-to-rvalue and \tcode{int} to \tcode{bool} conversions,
// performed before temporary is deleted at end of full-expression
{ }
- bool b = noexcept(S()); // exception specification of destructor of \tcode{S} considered for \keyword{noexcept}
+ bool b = noexcept(S(4)); // exception specification of destructor of \tcode{S} considered for \keyword{noexcept}
// full-expression is destruction of \tcode{s2} at end of block
}
diff --git a/source/classes.tex b/source/classes.tex
index 8735ff7c11..d0235a3f3c 100644
--- a/source/classes.tex
+++ b/source/classes.tex
@@ -605,11 +605,10 @@
\end{note}
\pnum
-A class is regarded as complete
-where its definition is reachable and
-within its complete-class contexts;
-otherwise it is regarded as incomplete within its own class
-\grammarterm{member-specification}.
+A class \tcode{C} is complete at a program point $P$
+if the definition of \tcode{C} is reachable from $P$\iref{module.reach}
+or if $P$ is in a complete-class context of \tcode{C}.
+Otherwise, \tcode{C} is incomplete at $P$.
\pnum
In a \grammarterm{member-declarator},
@@ -1247,38 +1246,34 @@
\pnum
A defaulted default constructor for class \tcode{X} is defined as deleted if:
\begin{itemize}
-\item \tcode{X} is a union that has a variant member
-with a non-trivial default constructor and
-no variant member of \tcode{X} has a default member initializer,
-
-\item \tcode{X} is a non-union class that has a variant member \tcode{M}
-with a non-trivial default constructor and
-no variant member of the anonymous union containing \tcode{M}
-has a default member initializer,
-
\item any non-static data member with no default member initializer\iref{class.mem} is
of reference type,
-\item any non-variant non-static data member of const-qualified type (or array
-thereof) with no \grammarterm{brace-or-equal-initializer}
+\item any non-variant non-static data member of const-qualified type
+(or possibly multi-dimensional array thereof)
+with no \grammarterm{brace-or-equal-initializer}
is not const-default-constructible\iref{dcl.init},
\item \tcode{X} is a union and all of its variant members are of const-qualified
-type (or array thereof),
+type (or possibly multi-dimensional array thereof),
\item \tcode{X} is a non-union class and all members of any anonymous union member are
-of const-qualified type (or array thereof),
+of const-qualified type (or possibly multi-dimensional array thereof),
\item any potentially constructed subobject, except for a non-static data member
-with a \grammarterm{brace-or-equal-initializer}, has
-class type \tcode{M} (or array thereof) and either \tcode{M}
-has no default constructor or overload resolution\iref{over.match}
-as applied to find \tcode{M}'s corresponding
-constructor results in an ambiguity or in a function that is deleted or
-inaccessible from the defaulted default constructor, or
-
-\item any potentially constructed subobject has a type
-with a destructor that is deleted or inaccessible from the defaulted default
+with a \grammarterm{brace-or-equal-initializer}
+or a variant member of a union where another non-static data member
+has a \grammarterm{brace-or-equal-initializer},
+has class type \tcode{M} (or possibly multi-dimensional array thereof)
+and overload resolution\iref{over.match}
+as applied to find \tcode{M}'s corresponding constructor
+either does not result in a usable candidate\iref{over.match.general}
+or, in the case of a variant member, selects a non-trivial function, or
+
+\item any potentially constructed subobject has
+class type \tcode{M} (or possibly multi-dimensional array thereof) and
+\tcode{M} has
+a destructor that is deleted or inaccessible from the defaulted default
constructor.
\end{itemize}
@@ -1543,18 +1538,16 @@
\tcode{X} is defined as deleted\iref{dcl.fct.def.delete} if \tcode{X} has:
\begin{itemize}
\item a potentially constructed subobject of type
- \tcode{M} (or array thereof) that cannot be copied/moved because
+ \tcode{M} (or possibly multi-dimensional array thereof) for which
overload resolution\iref{over.match}, as applied to find
- \tcode{M}'s
- corresponding constructor, results in an ambiguity or
- a function that is deleted or inaccessible from the
- defaulted constructor,
-
-\item a variant member whose corresponding constructor
- as selected by overload resolution is non-trivial,
-
-\item any potentially constructed subobject of a type
- with a destructor that is deleted or inaccessible from the defaulted
+ \tcode{M}'s corresponding constructor,
+ either does not result in a usable candidate\iref{over.match.general} or,
+ in the case of a variant member, selects a non-trivial function,
+
+\item any potentially constructed subobject of
+ class type \tcode{M} (or possibly multi-dimensional array thereof)
+ where \tcode{M} has
+ a destructor that is deleted or inaccessible from the defaulted
constructor, or,
\item for the copy constructor, a non-static data member of rvalue reference type.
@@ -1681,10 +1674,6 @@
copy assignment operators, and, if selected, will be used to assign an object.
\end{footnote}
\begin{note}
-An overloaded assignment operator must be declared to have only one parameter;
-see~\ref{over.ass}.
-\end{note}
-\begin{note}
More than one form of copy assignment operator can be declared for a class.
\end{note}
\begin{note}
@@ -1823,21 +1812,19 @@
A defaulted copy/move assignment operator for
class \tcode{X} is defined as deleted if \tcode{X} has:
\begin{itemize}
-\item a variant member with a non-trivial corresponding assignment operator and
- \tcode{X} is a union-like class, or
-
\item a non-static data member of \keyword{const} non-class
- type (or array thereof), or
+ type (or possibly multi-dimensional array thereof), or
\item a non-static data member of reference type, or
\item a direct non-static data member of class type \tcode{M}
- (or array thereof) or a direct base class \tcode{M}
+ (or possibly multi-dimensional array thereof) or
+ a direct base class \tcode{M}
that cannot be copied/moved because overload resolution
\iref{over.match}, as applied to find \tcode{M}'s corresponding
- assignment operator, results in an ambiguity or
- a function that is deleted or inaccessible from the
- defaulted assignment operator.
+ assignment operator,
+ either does not result in a usable candidate\iref{over.match.general} or,
+ in the case of a variant member, selects a non-trivial function.
\end{itemize}
\begin{note}
@@ -2070,13 +2057,11 @@
A defaulted destructor for a class
\tcode{X} is defined as deleted if:
\begin{itemize}
-\item \tcode{X} is a union-like class that has a variant
- member with a non-trivial destructor,
-
\item any potentially constructed subobject has class type
- \tcode{M} (or array thereof) and
- \tcode{M} has a deleted destructor or a destructor
- that is inaccessible from the defaulted destructor,
+ \tcode{M} (or possibly multi-dimensional array thereof) and
+ \tcode{M} has a destructor that is deleted or
+ is inaccessible from the defaulted destructor or,
+ in the case of a variant member, is non-trivial,
\item or, for a virtual destructor, lookup of the non-array deallocation
function results in an ambiguity or in a function that is deleted or
@@ -2489,17 +2474,16 @@
returning \grammarterm{conversion-type-id}''.
\pnum
-A conversion function is never used to convert a (possibly cv-qualified) object
-to the (possibly cv-qualified) same object type (or a reference to it),
-to a (possibly cv-qualified) base class of that type (or a reference to it),
+\begin{note}
+A conversion function is never invoked for
+implicit or explicit conversions of an object
+to the same object type (or a reference to it),
+to a base class of that type (or a reference to it),
or to \cv{}~\keyword{void}.
-\begin{footnote}
-These conversions are considered
-as standard conversions for the purposes of overload resolution\iref{over.best.ics,over.ics.ref} and therefore initialization\iref{dcl.init} and explicit casts\iref{expr.static.cast}. A conversion to \keyword{void} does not invoke any conversion function\iref{expr.static.cast}.
Even though never directly called to perform a conversion,
such conversion functions can be declared and can potentially
be reached through a call to a virtual conversion function in a base class.
-\end{footnote}
+\end{note}
\begin{example}
\begin{codeblock}
struct X {
@@ -5461,8 +5445,8 @@
\grammarterm{class-or-decltype} that denotes the constructor's class itself. If a
\grammarterm{mem-initializer-id} designates the constructor's class,
it shall be the only \grammarterm{mem-initializer}; the constructor
-is a \term{delegating constructor}, and the constructor selected by the
-\grammarterm{mem-initializer} is the \term{target constructor}.
+is a \defnadj{delegating}{constructor}, and the constructor selected by the
+\grammarterm{mem-initializer} is the \defnadj{target}{constructor}.
The target constructor is selected by overload resolution.
Once the target constructor returns, the body of the delegating constructor
is executed. If a constructor delegates to itself directly or indirectly,
diff --git a/source/compatibility.tex b/source/compatibility.tex
index 0bdb90b9cc..6c6028419a 100644
--- a/source/compatibility.tex
+++ b/source/compatibility.tex
@@ -1,6 +1,54 @@
%!TEX root = std.tex
\infannex{diff}{Compatibility}
+\rSec1[diff.cpp23]{\Cpp{} and ISO \CppXXIII{}}
+
+\rSec2[diff.cpp23.general]{General}
+
+\pnum
+\indextext{summary!compatibility with ISO \CppXXIII{}}%
+Subclause \ref{diff.cpp23} lists the differences between \Cpp{} and
+ISO \CppXXIII{} (ISO/IEC 14882:2023, \doccite{Programming Languages --- \Cpp{}}),
+by the chapters of this document.
+
+\rSec2[diff.cpp23.expr]{\ref{expr}: expressions}
+
+\diffref{dcl.init.list}
+\change
+Pointer comparisons between \tcode{initializer_list} objects' backing arrays
+are unspecified.
+\rationale
+Permit the implementation to store backing arrays in static read-only memory.
+\effect
+Valid \CppXXIII{} code
+that relies on the result of pointer comparison between backing arrays
+may change behavior.
+For example:
+\begin{codeblock}
+bool ne(std::initializer_list a, std::initializer_list b) {
+ return a.begin() != b.begin() + 1;
+}
+bool b = ne({2,3}, {1,2,3}); // unspecified result; previously \tcode{false}
+\end{codeblock}
+
+\rSec2[diff.cpp23.strings]{\ref{strings}: strings library}
+
+\diffref{string.conversions}
+\change
+Output of floating-point overloads of \tcode{to_string} and \tcode{to_wstring}.
+\rationale
+Prevent loss of information and improve consistency with other formatting
+facilities.
+\effect
+\tcode{to_string} and \tcode{to_wstring} function calls that take
+floating-point arguments may produce a different output.
+For example:
+\begin{codeblock}
+auto s = std::to_string(1e-7); // \tcode{"1e-07"}
+ // previously \tcode{"0.000000"} with \tcode{'.'} possibly
+ // changed according to the global C locale
+\end{codeblock}
+
\rSec1[diff.cpp20]{\Cpp{} and ISO \CppXX{}}
\rSec2[diff.cpp20.general]{General}
diff --git a/source/config.tex b/source/config.tex
index d764e25075..8b24727467 100644
--- a/source/config.tex
+++ b/source/config.tex
@@ -1,8 +1,8 @@
%!TEX root = std.tex
%%--------------------------------------------------
%% Version numbers
-\newcommand{\docno}{N4950}
-\newcommand{\prevdocno}{N4944}
+\newcommand{\docno}{N4958}
+\newcommand{\prevdocno}{N4950}
\newcommand{\cppver}{202302L}
%% Release date
diff --git a/source/containers.tex b/source/containers.tex
index c2b3a424fa..21abef6cad 100644
--- a/source/containers.tex
+++ b/source/containers.tex
@@ -69,12 +69,12 @@
aligned buffers and call \tcode{construct} to place the element into the buffer.
\end{note}
-\rSec2[container.gen.reqmts]{General containers}
+\rSec2[container.requirements.general]{General containers}
-\rSec3[container.requirements.general]{General}
+\rSec3[container.intro.reqmts]{Introduction}
\pnum
-In subclause \ref{container.gen.reqmts},
+In subclause \ref{container.requirements.general},
\begin{itemize}
\item
\tcode{X} denotes a container class containing objects of type \tcode{T},
@@ -103,7 +103,7 @@
ranges::@\libconcept{input_range}@ && @\libconcept{convertible_to}@, T>;
\end{codeblock}
-\rSec3[container.reqmts]{Containers}
+\rSec3[container.reqmts]{Container requirements}
% Local command to index names as members of all containers.
\newcommand{\indexcont}[1]{%
@@ -2176,8 +2176,8 @@
\tcode{reference; const_reference} for constant \tcode{a}
\pnum
-\returns
-\tcode{*(a.begin() + n)}
+\effects
+Equivalent to: \tcode{return *(a.begin() + n);}
\pnum
\remarks
@@ -2705,7 +2705,7 @@
\pnum
A type \tcode{X} meets the \defnadj{associative}{container} requirements
if \tcode{X} meets all the requirements of an allocator-aware
-container\iref{container.requirements.general} and
+container\iref{container.reqmts} and
the following types, statements, and expressions are well-formed and
have the specified semantics,
except that for
@@ -4204,7 +4204,7 @@
A type \tcode{X} meets
the \defnadj{unordered associative}{container} requirements
if \tcode{X} meets all the requirements of
-an allocator-aware container\iref{container.requirements.general} and
+an allocator-aware container\iref{container.reqmts} and
the following types, statements, and expressions are well-formed and
have the specified semantics,
except that for \tcode{unordered_map} and \tcode{unordered_multimap},
@@ -4675,7 +4675,7 @@
\begin{itemdescr}
\pnum
\effects
-In addition to the container requirements\iref{container.requirements.general},
+In addition to the container requirements\iref{container.reqmts},
copies the hash function, predicate, and maximum load factor.
\pnum
@@ -5577,6 +5577,35 @@
Constant.
\end{itemdescr}
+\indexunordmem{bucket}%
+\begin{itemdecl}
+a_tran.bucket(ke)
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\result
+\tcode{size_type}
+
+\pnum
+\expects
+\tcode{a_tran.bucket_count() > 0}.
+
+\pnum
+\ensures
+The return value is in the range \tcode{[0, a_tran.bucket_count())}.
+
+\pnum
+\returns
+The index of the bucket
+in which elements with keys equivalent to \tcode{ke} would be found,
+if any such element existed.
+
+\pnum
+\complexity
+Constant.
+\end{itemdescr}
+
\indexunordmem{bucket_size}%
\begin{itemdecl}
b.bucket_size(n)
@@ -5859,7 +5888,7 @@
\pnum
The member function templates
\tcode{find}, \tcode{count}, \tcode{equal_range}, \tcode{contains},
-\tcode{extract}, and \tcode{erase}
+\tcode{extract}, \tcode{erase}, and \tcode{bucket}
shall not participate in overload resolution unless
the \grammarterm{qualified-id}s
\tcode{Pred::is_transparent} and
@@ -9718,8 +9747,11 @@
// \ref{map.access}, element access
mapped_type& operator[](const key_type& x);
mapped_type& operator[](key_type&& x);
+ template mapped_type& operator[](K&& x);
mapped_type& at(const key_type& x);
const mapped_type& at(const key_type& x) const;
+ template mapped_type& at(const K& x);
+ template const mapped_type& at(const K& x) const;
// \ref{map.modifiers}, modifiers
template pair emplace(Args&&... args);
@@ -9747,18 +9779,26 @@
pair try_emplace(const key_type& k, Args&&... args);
template
pair try_emplace(key_type&& k, Args&&... args);
+ template
+ pair try_emplace(K&& k, Args&&... args);
template
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
template
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
+ template
+ iterator try_emplace(const_iterator hint, K&& k, Args&&... args);
template
pair insert_or_assign(const key_type& k, M&& obj);
template
pair insert_or_assign(key_type&& k, M&& obj);
+ template
+ pair insert_or_assign(K&& k, M&& obj);
template
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
template
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
+ template
+ iterator insert_or_assign(const_iterator hint, K&& k, M&& obj);
iterator erase(iterator position);
iterator erase(const_iterator position);
@@ -9932,6 +9972,22 @@
Equivalent to: \tcode{return try_emplace(std::move(x)).first->second;}
\end{itemdescr}
+\indexlibrary{\idxcode{operator[]}!\idxcode{map}}%
+\begin{itemdecl}
+template mapped_type& operator[](K&& x);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id} \tcode{Compare::is_transparent}
+is valid and denotes a type.
+
+\pnum
+\effects
+Equivalent to: \tcode{return try_emplace(std::forward(x)).first->second;}
+\end{itemdescr}
+
\indexlibrarymember{at}{map}%
\begin{itemdecl}
mapped_type& at(const key_type& x);
@@ -9953,6 +10009,36 @@
Logarithmic.
\end{itemdescr}
+\indexlibrarymember{at}{map}%
+\begin{itemdecl}
+template mapped_type& at(const K& x);
+template const mapped_type& at(const K& x) const;
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id} \tcode{Compare::is_transparent}
+is valid and denotes a type.
+
+\pnum
+\expects
+The expression \tcode{find(x)} is well-formed and has well-defined behavior.
+
+\pnum
+\returns
+A reference to \tcode{find(x)->second}.
+
+\pnum
+\throws
+An exception object of type \tcode{out_of_range} if
+\tcode{find(x) == end()} is \tcode{true}.
+
+\pnum
+\complexity
+Logarithmic.
+\end{itemdescr}
+
\rSec3[map.modifiers]{Modifiers}
\indexlibrarymember{insert}{map}%
@@ -10051,6 +10137,55 @@
respectively.
\end{itemdescr}
+\indexlibrarymember{try_emplace}{map}%
+\begin{itemdecl}
+template
+ pair try_emplace(K&& k, Args&&... args);
+template
+ iterator try_emplace(const_iterator hint, K&& k, Args&&... args);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id} \tcode{Compare::is_transparent}
+is valid and denotes a type.
+For the first overload,
+\tcode{is_convertible_v} and
+\tcode{is_convertible_v}
+are both \tcode{false}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible} into \tcode{map} from
+\tcode{piecewise_construct, forward_as_tuple(std::forward(k)),
+forward_as_tuple(std::forward(args)...)}.
+
+\pnum
+\effects
+If the map already contains an element whose key is equivalent to \tcode{k},
+there is no effect.
+Otherwise, let \tcode{r} be \tcode{equal_range(k)}.
+Constructs an object \tcode{u} of type \tcode{value_type} with
+\tcode{piecewise_construct, forward_as_tuple(std::forward(k)),
+forward_as_tuple(std::forward(args)...)}.\linebreak
+If \tcode{equal_range(u.first) == r} is \tcode{false},
+the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is \tcode{true}
+if and only if the insertion took place.
+The returned iterator points to the map element
+whose key is equivalent to \tcode{k}.
+
+\pnum
+\complexity
+The same as \tcode{emplace} and \tcode{emplace_hint}, respectively.
+\end{itemdescr}
+
\indexlibrarymember{insert_or_assign}{map}%
\begin{itemdecl}
template
@@ -10131,6 +10266,54 @@
respectively.
\end{itemdescr}
+\indexlibrarymember{insert_or_assign}{map}%
+\begin{itemdecl}
+template
+ pair insert_or_assign(K&& k, M&& obj);
+template
+ iterator insert_or_assign(const_iterator hint, K&& k, M&& obj);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id} \tcode{Compare::is_transparent}
+is valid and denotes a type.
+
+\pnum
+\mandates
+\tcode{is_assignable_v} is \tcode{true}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible} into \tcode{map} from
+\tcode{std::forward(k), std::\newline forward(obj)}.
+
+\pnum
+\effects
+If the map already contains an element \tcode{e}
+whose key is equivalent to \tcode{k},
+assigns \tcode{std::forward\newline (obj)} to \tcode{e.second}.
+Otherwise, let \tcode{r} be \tcode{equal_range(k)}.
+Constructs an object \tcode{u} of type \tcode{value_type}
+with \tcode{std::forward(k), std::forward(obj)}.
+If \tcode{equal_range(u.first) == r} is \tcode{false},
+the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is \tcode{true}
+if and only if the insertion took place.
+The returned iterator points to the map element
+whose key is equivalent to \tcode{k}.
+
+\pnum
+\complexity
+The same as \tcode{emplace} and \tcode{emplace_hint}, respectively.
+\end{itemdescr}
+
\rSec3[map.erasure]{Erasure}
\indexlibrarymember{erase_if}{map}%
@@ -10640,13 +10823,15 @@
size_type size() const noexcept;
size_type max_size() const noexcept;
- // modifiers
+ // \ref{set.modifiers}, modifiers
template pair emplace(Args&&... args);
template iterator emplace_hint(const_iterator position, Args&&... args);
pair insert(const value_type& x);
pair insert(value_type&& x);
+ template pair insert(K&& x);
iterator insert(const_iterator position, const value_type& x);
iterator insert(const_iterator position, value_type&& x);
+ template iterator insert(const_iterator position, K&& x);
template
void insert(InputIterator first, InputIterator last);
template<@\exposconcept{container-compatible-range}@ R>
@@ -10832,6 +11017,50 @@
\end{codeblock}
\end{itemdescr}
+\rSec3[set.modifiers]{Modifiers}
+
+\indexlibrarymember{insert}{set}%
+\begin{itemdecl}
+template pair insert(K&& x);
+template iterator insert(const_iterator hint, K&& x);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id} \tcode{Compare::is_transparent}
+is valid and denotes a type.
+For the second overload,
+\tcode{is_convertible_v} and
+\tcode{is_convertible_v} are both \tcode{false}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible} into \tcode{set} from
+\tcode{std::forward(x)}.
+
+\pnum
+\effects
+If the set already contains an element that is equivalent to \tcode{x},
+there is no effect.
+Otherwise, let \tcode{r} be \tcode{equal_range(x)}.
+Constructs an object \tcode{u} of type \tcode{value_type}
+with \tcode{std::forward(x)}.
+If \tcode{equal_range(u) == r} is \tcode{false}, the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is true
+if and only if the insertion took place.
+The returned iterator points to the set element that is equivalent to \tcode{x}.
+
+\pnum
+\complexity
+Logarithmic.
+\end{itemdescr}
+
\rSec2[multiset]{Class template \tcode{multiset}}
\rSec3[multiset.overview]{Overview}
@@ -11464,18 +11693,26 @@
pair try_emplace(const key_type& k, Args&&... args);
template
pair try_emplace(key_type&& k, Args&&... args);
+ template
+ pair try_emplace(K&& k, Args&&... args);
template
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
template
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
+ template
+ iterator try_emplace(const_iterator hint, K&& k, Args&&... args);
template
pair insert_or_assign(const key_type& k, M&& obj);
template
pair insert_or_assign(key_type&& k, M&& obj);
+ template
+ pair insert_or_assign(K&& k, M&& obj);
template
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
template
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
+ template
+ iterator insert_or_assign(const_iterator hint, K&& k, M&& obj);
iterator erase(iterator position);
iterator erase(const_iterator position);
@@ -11524,14 +11761,18 @@
// \ref{unord.map.elem}, element access
mapped_type& operator[](const key_type& k);
mapped_type& operator[](key_type&& k);
+ template mapped_type& operator[](K&& k);
mapped_type& at(const key_type& k);
const mapped_type& at(const key_type& k) const;
+ template mapped_type& at(const K& k);
+ template const mapped_type& at(const K& k) const;
// bucket interface
size_type bucket_count() const noexcept;
size_type max_bucket_count() const noexcept;
size_type bucket_size(size_type n) const;
size_type bucket(const key_type& k) const;
+ template size_type bucket(const K& k) const;
local_iterator begin(size_type n);
const_local_iterator begin(size_type n) const;
local_iterator end(size_type n);
@@ -11712,6 +11953,23 @@
Equivalent to: \tcode{return try_emplace(std::move(k)).first->second;}
\end{itemdescr}
+\indexlibrarymember{unordered_map}{operator[]}%
+\indextext{\idxcode{unordered_map}!element access}%
+\begin{itemdecl}
+template mapped_type& operator[](K&& k);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id}s \tcode{Hash::is_transparent} and
+\tcode{Pred::is_transparent} are valid and denote types.
+
+\pnum
+\effects
+Equivalent to: \tcode{return try_emplace(std::forward(k)).first->second;}
+\end{itemdescr}
+
\indexlibrarymember{unordered_map}{at}%
\indextext{\idxcode{unordered_map}!element access}%
\begin{itemdecl}
@@ -11729,6 +11987,33 @@
An exception object of type \tcode{out_of_range} if no such element is present.
\end{itemdescr}
+\indexlibrarymember{unordered_map}{at}%
+\indextext{\idxcode{unordered_map}!element access}%
+\begin{itemdecl}
+template mapped_type& at(const K& k);
+template const mapped_type& at(const K& k) const;
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id}s \tcode{Hash::is_transparent} and
+\tcode{Pred::is_transparent} are valid and denote types.
+
+\pnum
+\expects
+The expression \tcode{find(k)} is well-formed and has well-defined behavior.
+
+\pnum
+\returns
+A reference to \tcode{find(k)->second}.
+
+\pnum
+\throws
+An exception object of type \tcode{out_of_range}
+if \tcode{find(k) == end()} is \tcode{true}.
+\end{itemdescr}
+
\rSec3[unord.map.modifiers]{Modifiers}
\indexlibrarymember{unordered_map}{insert}%
@@ -11841,32 +12126,81 @@
respectively.
\end{itemdescr}
-\indexlibrarymember{insert_or_assign}{unordered_map}%
+\indexlibrarymember{try_emplace}{unordered_map}%
\begin{itemdecl}
-template
- pair insert_or_assign(const key_type& k, M&& obj);
-template
- iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
+template
+ pair try_emplace(K&& k, Args&&... args);
+template
+ iterator try_emplace(const_iterator hint, K&& k, Args&&... args);
\end{itemdecl}
\begin{itemdescr}
\pnum
-\mandates
-\tcode{is_assignable_v} is \tcode{true}.
+\constraints
+The \grammarterm{qualified-id}s \tcode{Hash::is_transparent} and
+\tcode{Pred::is_transparent} are valid and denote types.
+For the first overload,
+\tcode{is_convertible_v} and
+\tcode{is_convertible_v} are both \tcode{false}.
\pnum
\expects
-\tcode{value_type} is \oldconcept{EmplaceConstructible} into \tcode{unordered_map}
-from \tcode{k}, \tcode{std::for\-ward(obj)}.
+\tcode{value_type} is \oldconcept{EmplaceConstructible}
+into \tcode{unordered_map} from
+\tcode{piecewise_construct, forward_as_tuple(std::forward(k)),
+forward_as_tuple(std::forward\newline (args)...)}.
\pnum
\effects
-If the map already contains an element \tcode{e}
-whose key is equivalent to \tcode{k},
-assigns \tcode{std::for\-ward(obj)} to \tcode{e.second}.
-Otherwise inserts an object of type \tcode{value_type}
-constructed with \tcode{k}, \tcode{std::forward(obj)}.
-
+If the map already contains an element whose key is equivalent to \tcode{k},
+there is no effect.
+Otherwise, let \tcode{h} be \tcode{hash_function()(k)}.
+Constructs an object \tcode{u} of type \tcode{value_type}
+with \tcode{piecewise_construct, forward_as_tuple(std::forward(k)),
+forward_as_tuple(std::forward(args)...)}.\newline
+If \tcode{hash_function()(u.first) != h || contains(u.first)} is \tcode{true},
+the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is \tcode{true}
+if and only if the insertion took place.
+The returned iterator points to the map element
+whose key is equivalent to \tcode{k}.
+
+\pnum
+\complexity
+The same as \tcode{emplace} and \tcode{emplace_hint}, respectively.
+\end{itemdescr}
+
+\indexlibrarymember{insert_or_assign}{unordered_map}%
+\begin{itemdecl}
+template
+ pair insert_or_assign(const key_type& k, M&& obj);
+template
+ iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\mandates
+\tcode{is_assignable_v} is \tcode{true}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible} into \tcode{unordered_map}
+from \tcode{k}, \tcode{std::for\-ward(obj)}.
+
+\pnum
+\effects
+If the map already contains an element \tcode{e}
+whose key is equivalent to \tcode{k},
+assigns \tcode{std::for\-ward(obj)} to \tcode{e.second}.
+Otherwise inserts an object of type \tcode{value_type}
+constructed with \tcode{k}, \tcode{std::forward(obj)}.
+
\pnum
\returns
In the first overload,
@@ -11921,6 +12255,55 @@
respectively.
\end{itemdescr}
+\indexlibrarymember{insert_or_assign}{unordered_map}%
+\begin{itemdecl}
+template
+ pair insert_or_assign(K&& k, M&& obj);
+template
+ iterator insert_or_assign(const_iterator hint, K&& k, M&& obj);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id}s \tcode{Hash::is_transparent} and
+\tcode{Pred::is_transparent} are valid and denote types.
+
+\pnum
+\mandates
+\tcode{is_assignable_v} is \tcode{true}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible}
+into \tcode{unordered_map}
+from \tcode{std::forward\newline (k), std::forward(obj)}.
+
+\pnum
+\effects
+If the map already contains an element \tcode{e}
+whose key is equivalent to \tcode{k},
+assigns \tcode{std::forward\newline (obj)} to \tcode{e.second}.
+Otherwise, let \tcode{h} be \tcode{hash_function()(k)}.
+Constructs an object \tcode{u} of type \tcode{value_type}
+with \tcode{std::forward(k), std::forward(obj)}.
+If \tcode{hash_function()(u.first) != h || contains(u.first)} is \tcode{true},
+the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is \tcode{true}
+if and only if the insertion took place.
+The returned iterator points to the map element
+whose key is equivalent to \tcode{k}.
+
+\pnum
+\complexity
+The same as \tcode{emplace} and \tcode{emplace_hint}, respectively.
+\end{itemdescr}
+
\rSec3[unord.map.erasure]{Erasure}
\indexlibrarymember{erase_if}{unordered_map}%
@@ -12152,6 +12535,7 @@
size_type max_bucket_count() const noexcept;
size_type bucket_size(size_type n) const;
size_type bucket(const key_type& k) const;
+ template size_type bucket(const K& k) const;
local_iterator begin(size_type n);
const_local_iterator begin(size_type n) const;
local_iterator end(size_type n);
@@ -12504,13 +12888,15 @@
size_type size() const noexcept;
size_type max_size() const noexcept;
- // modifiers
+ // \ref{unord.set.modifiers}, modifiers
template pair emplace(Args&&... args);
template iterator emplace_hint(const_iterator position, Args&&... args);
pair insert(const value_type& obj);
pair insert(value_type&& obj);
+ template pair insert(K&& obj);
iterator insert(const_iterator hint, const value_type& obj);
iterator insert(const_iterator hint, value_type&& obj);
+ template iterator insert(const_iterator hint, K&& obj);
template void insert(InputIterator first, InputIterator last);
template<@\exposconcept{container-compatible-range}@ R>
void insert_range(R&& rg);
@@ -12572,6 +12958,7 @@
size_type max_bucket_count() const noexcept;
size_type bucket_size(size_type n) const;
size_type bucket(const key_type& k) const;
+ template size_type bucket(const K& k) const;
local_iterator begin(size_type n);
const_local_iterator begin(size_type n) const;
local_iterator end(size_type n);
@@ -12744,6 +13131,52 @@
\end{codeblock}
\end{itemdescr}
+\rSec3[unord.set.modifiers]{Modifiers}
+
+\indexlibrarymember{insert}{unordered_set}%
+\begin{itemdecl}
+template pair insert(K&& obj);
+template iterator insert(const_iterator hint, K&& obj);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\constraints
+The \grammarterm{qualified-id}s \tcode{Hash::is_transparent} and
+\tcode{Pred::is_transparent} are valid and denote types.
+For the second overload,
+\tcode{is_convertible_v} and
+\tcode{is_convertible_v} are both \tcode{false}.
+
+\pnum
+\expects
+\tcode{value_type} is \oldconcept{EmplaceConstructible}
+into \tcode{unordered_set} from \tcode{std::forward\newline (obj)}.
+
+\pnum
+\effects
+If the set already contains an element that is equivalent to \tcode{obj},
+there is no effect.
+Otherwise, let \tcode{h} be \tcode{hash_function()(obj)}.
+Constructs an object \tcode{u} of type \tcode{value_type}
+with \tcode{std::forward(obj)}.
+If \tcode{hash_function()(u) != h || contains(u)} is \tcode{true},
+the behavior is undefined.
+Inserts \tcode{u} into \tcode{*this}.
+
+\pnum
+\returns
+For the first overload,
+the \tcode{bool} component of the returned pair is \tcode{true}
+if and only if the insertion took place.
+The returned iterator points to the set element
+that is equivalent to \tcode{obj}.
+
+\pnum
+\complexity
+Average case constant, worst case linear.
+\end{itemdescr}
+
\rSec2[unord.multiset]{Class template \tcode{unordered_multiset}}%
\indexlibraryglobal{unordered_multiset}
@@ -12946,6 +13379,7 @@
size_type max_bucket_count() const noexcept;
size_type bucket_size(size_type n) const;
size_type bucket(const key_type& k) const;
+ template size_type bucket(const K& k) const;
local_iterator begin(size_type n);
const_local_iterator begin(size_type n) const;
local_iterator end(size_type n);
@@ -14758,6 +15192,11 @@
// \ref{flat.map.cons}, construct/copy/destroy
flat_map() : flat_map(key_compare()) { }
+ template
+ flat_map(const flat_map&, const Allocator& a);
+ template
+ flat_map(flat_map&&, const Allocator& a);
+
flat_map(key_container_type key_cont, mapped_container_type mapped_cont,
const key_compare& comp = key_compare());
template
@@ -15073,7 +15512,7 @@
sorts the range \range{begin()}{end()} with respect to \tcode{value_comp()}; and
finally erases the duplicate elements as if by:
\begin{codeblock}
-auto zv = ranges::zip_view(c.keys, c.values);
+auto zv = views::zip(c.keys, c.values);
auto it = ranges::unique(zv, key_equiv(compare)).begin();
auto dist = distance(zv.begin(), it);
c.keys.erase(c.keys.begin() + dist, c.keys.end());
@@ -15166,6 +15605,10 @@
\indexlibraryctor{flat_map}%
\begin{itemdecl}
+template
+ flat_map(const flat_map&, const Allocator& a);
+template
+ flat_map(flat_map&&, const Allocator& a);
template