diff --git a/.travis.yml b/.travis.yml
index 6aa3f6338c..02876d6572 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,7 +18,7 @@ env:
- BUILD_TYPE=make # build using Makefile
- BUILD_TYPE=complete # build manually and regenerate figures, grammar, and cross-references
- BUILD_TYPE=check-whitespace # check for whitespace at the ends of lines
- - BUILD_TYPE=check-newlines # check for blank lines at the ends of files
+ - BUILD_TYPE=check-newlines # check for blank lines at the ends of files
- BUILD_TYPE=check-macro-use # check for proper macro use
script:
@@ -26,7 +26,8 @@ script:
- pushd source
- if [ "$BUILD_TYPE" = "latexmk" ]; then
docker exec -it texlive-basic bash -c "cd /$TRAVIS_REPO_SLUG/source && latexmk -pdf std -silent";
- ! grep -Fe "Overfull \\hbox" std.log;
+ ! grep -Fe "Overfull \\hbox" std.log &&
+ ! grep "LaTeX Warning..There were undefined references" std.log;
fi
- if [ "$BUILD_TYPE" = "make" ]; then
docker exec -it texlive-basic bash -c "cd /$TRAVIS_REPO_SLUG/source && make -j2";
diff --git a/papers/n4762.pdf b/papers/n4762.pdf
new file mode 100644
index 0000000000..4b0f08275e
Binary files /dev/null and b/papers/n4762.pdf differ
diff --git a/papers/n4764.html b/papers/n4764.html
new file mode 100644
index 0000000000..97f0d1a0dd
--- /dev/null
+++ b/papers/n4764.html
@@ -0,0 +1,1350 @@
+
N4764
+N4764 Editors' Report -- Programming Languages -- C++
+
+2018-07-07
+Richard Smith (editor) (Google Inc)
+Thomas Köppe (co-editor) (Google DeepMind)
+Jens Maurer (co-editor)
+Dawn Perchik (co-editor) (Bright Side Computing, LLC)
+<cxxeditor@gmail.com>
+
+Acknowledgements
+
+Special thanks to Casey Carter for supplying a pull request to merge
+P0898R3 (LWG motion 28),
+and working with us on editorial cleanups within the
+12 pages of added text.
+
+Thanks to all those who have submitted editorial
+issues
+and to those who have provided pull requests with fixes.
+
+New papers
+
+
+- N4762 is the current working draft for C++20. It replaces N4750.
+- N4764 is this Editors' Report.
+
+
+Motions incorporated into working draft
+
+Core working group motions
+
+CWG motion 1: Core issue resolutions for 6 issues in "ready" status applied:
+
+
+- 2254 Standard-layout classes and bit-fields
+- 2293 Requirements for simple-template-id used as a class-name
+- 2294 Dependent
auto
static data members
+- 2321 Conditional operator and cv-qualified class prvalues
+- 2322 Substitution failure and lexical order
+- 2339 Underspecified template arguments in structured bindings
+
+
+CWG motion 2: Core issue resolutions for 6 issues in "tentatively ready" status applied:
+
+
+- 2233 Function parameter packs following default arguments
+- 2249 identifiers and id-expressions
+- 2285 Issues with structured bindings
+- 2351
void{}
+- 2356 Base class copy and move constructors should not be inherited
+- 2359 Unintended copy initialization with designated initializers (not a DR)
+
+
+CWG motion 3: P0806R2 "Deprecate implicit capture of this
via [=]
"
+
+CWG motion 4: P1042R1 "__VA_OPT__
wording clarifications"
+
+CWG motion 5: P0929R2 "Checking for abstract class types" applied, resolving 2 core issues:
+
+
+- 1640 Array of abstract instance of class template
+- 1646 decltype-specifiers, abstract classes, and deduction failure
+
+
+CWG motion 6: P0732R2 "Class types in non-type template parameters"
+
+CWG motion 7 was not approved
+
+CWG motion 8: P1025R1 "Update the reference to the Unicode standard"
+
+CWG motion 9: P0528R3 "The curious case of padding bits, featuring atomic compare-and-exchange"
+
+CWG motion 10: P0722R3 "Efficient sized delete for variable sized classes"
+
+CWG motion 11: P1064R0 "Allowing virtual function calls in constant expressions"
+
+CWG motion 12: P1008R1 "Prohibit aggregates with user-declared constructors"
+
+CWG motion 13: P1120R0 "Consistency improvements for <=>
and other comparison operators"
+
+CWG motion 14: P0542R5 "Contract-based programming" see below
+
+CWG motion 15: P0941R2 "Feature-test macros" see below
+
+CWG motion 16: P0892R2 "explicit(bool)
"
+
+Library working group motions
+
+LWG motions 1-5 apply to the Parallelism TS
+
+LWG motions 6 and 7 apply to the Reflection TS
+
+LWG motions 8 and 9 apply to the Coroutines TS
+
+LWG motion 10 applies to the Networking TS
+
+LWG motion 11: Library issue resolutions for 14 issues in "Ready" and "Tentatively Ready" status applied:
+
+
+- 2139 What is a user-defined type? see below
+- 2970 Return type of
std::visit
misspecified
+- 3058 Parallel
adjacent_difference
shouldn't require creating temporaries
+- 3062 Unnecessary
decay_t
in is_execution_policy_v
should be remove_cvref_t
+- 3067
recursive_directory_iterator::pop
must invalidate
+- 3074 Non-member functions for
valarray
should only deduce from the valarray
+- 3076
basic_string
CTAD ambiguity
+- 3079 LWG 2935 forgot to fix the
existing_p
overloads of create_directory
+- 3080 Floating point
from_chars
pattern specification breaks round-tripping
+- 3083 What should
ios::iword(-1)
do?
+- 3094 [time.duration.io]p4 makes surprising claims about encoding
+- 3100 Unnecessary and confusing "empty span" wording
+- 3102 Clarify
span
iterator
and const_iterator
behavior
+- 3104 Fixing
duration
division
+- Resolution of 3071 (
read_until
still refers to
+"input sequence") from P1082R0 was not part of this motion, as it applies to
+the Networking TS.
+
+
+LWG motion 12: Library issue resolution for 1 issue applied:
+
+
+- 2511 Guaranteed copy elision for piecewise construction
+
+
+LWG motion 13: P0476R2 "Bit-casting object representations"
+
+LWG motion 14: P0788R3 "Standard library specification in a concepts and contracts world"
+
+LWG motion 15 was not approved
+
+LWG motion 16: P0458R2 "Checking for existence of an element in associative containers"
+
+LWG motion 17: P0759R1 "fpos
requirements"
+
+LWG motion 18: P1023R0 "constexpr
comparison operators for std::array
"
+
+LWG motion 19: P0769R2 "Add shift
to <algorithm>
"
+
+LWG motion 20: P0887R1 "The identity
metafunction"
+
+LWG motion 21: P0879R0 "constexpr
for swap
and swap
-related functions" applied, resolving 1 issue:
+
+
+
+LWG motion 22: P0758R1 "Implicit conversion traits and utility functions"
+
+LWG motion 23: P0556R3 "Integral power-of-2 operations"
+
+LWG motion 24: P0019R8 "atomic_ref
"
+
+LWG motion 25: P0935R0 "Eradicating unnecessarily explicit default constructors from the standard library"
+
+LWG motion 26: P0646R1 "Improving the return value of erase
-like algorithms"
+
+LWG motion 27: P0619R4 "Reviewing deprecated facilities of C++17 for C++20" see below
+
+LWG motion 28: P0898R3 "Standard library concepts" see below
+
+Notable editorial changes
+
+CWG motion 14
+
+Subclause structure and paragraph order of [dcl.attr.contracts] was reworked.
+Several normatively-redundant statements were converted to notes or removed.
+
+CWG motion 15
+
+Multiple papers moved at this meeting included suggested feature-test macros.
+However, these were not presented as editing instructions, because we did not
+have feature-test macros in the standard wording yet. After consultation with
+CWG and LWG, the following feature test macros have been added in addition to
+those listed in CWG motion 15 (all with value 201806L
):
+
+
+__has_cpp_attribute(assert)
+__has_cpp_attribute(ensures)
+__has_cpp_attribute(expects)
+__cpp_explicit_bool
+__cpp_nontype_template_parameter_class
+__cpp_lib_atomic_ref
+__cpp_lib_bit_cast
+__cpp_lib_concepts
+__cpp_lib_constexpr_swap_algorithms
+__cpp_lib_list_remove_return_type
+
+
+CWG motions 16 and 12
+
+CWG motion 16 would have us change wording that was deleted by CWG motion 12.
+The requested change in CWG motion 16 (from teletype "explicit
" to body font "explicit")
+was ignored.
+
+LWG motion 11: issue 2139
+
+The underlying text has changed between the drafting of the resolution to this
+issue and its application. We believe every requested edit has been applied;
+however, an additional use of "user-defined type" has been added to
+[namespace.std] that should likely also have been covered by this wording.
+It has not been changed.
+
+LWG motions 13 and 23
+
+These motions both introduce a <bit>
header, but the organizational structure
+suggested by motion 23 doesn't make sense for the functionality
+added by motion 13.
+The wording of motion 23 has been rearranged to fit into
+the structure established by motion 13.
+
+LWG motions 16
+
+Added the new contains
member function for associative containers to the list
+of member function templates that do not participate in overload resolution
+unless the comparator is transparent, after consultation with LWG.
+
+LWG motions 19 and 21
+
+LWG motion 19 adds a shift_right
algorithm to <algorithm>
+as a non-constexpr
function template.
+
+LWG motion 21 instructs that we mark
+all non-parallel algorithms in <algorithm>
+as constexpr
.
+Naturally, however,
+its proposed wording change does not list the shift_right
algorithm.
+After consultation with LWG, shift_right
has been marked constexpr
+to satisfy the intent of LWG motion 21.
+
+LWG motion 27
+
+Synopses for
+<ccomplex>
,
+<cstdalign>
,
+<cstdbool>
, and
+<ctgmath>
+were not removed;
+instead, they have been repurposed as synopses for
+<complex.h>
,
+<stdalign.h>
,
+<stdbool.h>
, and
+<tgmath.h>
.
+(The latter used to be defined in terms of the former,
+but can no longer be specified in that way.)
+Also introduced a synopsis for <iso646.h>
.
+
+LWG motion 28
+
+Clause labels shortened and simplified throughout.
+
+The single-item clauses [concept.movable], [concept.copyable],
+[concept.semiregular], and [concept.regular] have been merged into their
+parent, [concepts.object].
+
+The single-item clauses [concept.signed.int] and [concept.unsigned.int]
+have been merged into their parent, [concept.integral].
+
+Legacy concept names changed from Cpp98Something to Cpp17Something. Many of
+these concepts did not exist in C++98 (which in any case was revoked and
+replaced by C++03).
+
+Reworked "uniform random bit generator" requirements to describe them in terms
+of the UniformRandomBitGenerator
concept.
+
+Removed "there need be no subsumption relationship" wording that is already
+implied by the core language rules for concepts.
+
+
+
+The claue reorganization described in P1076R1 and discussed at the WG21
+Rapperswil meeting has been applied to the working draft, with the following
+modifications:
+
+[class.copy] was left containing only two paragraphs of text, neither of which
+had any normative impact. It has been removed.
+
+The top-level subclauses of [algorithms] have been reordered to make the
+description of the <numeric>
header fit better into its structure.
+
+Several paragraphs of [class] describing various properties of classes have
+been moved into a new subclause [class.prop] "Properties of clases".
+
+Removal of single-item subclauses
+
+The single-item subclauses
+[move.iter.op=] and
+[move.iter.op.const]
+have been merged into [move.iter.cons].
+
+The single-item subclauses
+[move.iter.op.star],
+[move.iter.op.ref], and
+[move.iter.op.index]
+have been merged into [move.iter.elem].
+
+The single-item subclauses
+[move.iter.op.+],
+[move.iter.op.-],
+[move.iter.op.incr],
+[move.iter.op.+=],
+[move.iter.op.decr], and
+[move.iter.op.-=]
+have been merged into [move.iter.nav].
+
+The now-empty [move.iter.ops] has been removed.
+
+Minor editorial fixes
+
+A log of editorial fixes made to the working draft since N4750 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 afe115acc28e33e48e2ece9f850820d6faa51757
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jul 6 10:47:19 2018 +0200
+
+ [class] Introduce a subheading 'Properties of classes'.
+
+commit d3f80a4a994a66cc8148a6031d29182aad4f16f6
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sat Jul 7 00:49:56 2018 +0200
+
+ [namespace.udecl] Demote normative duplication to notes (#1976)
+
+ The effects of using-declarations naming member functions
+ are discussed in other parts of the standard.
+ The effects of initializing with an inherited constructor are
+ discussed elsewhere, too.
+
+commit 9459c137f138f903d670e6689b3963f0a3f7d083
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jul 6 10:40:09 2018 +0200
+
+ [time.point,time.duration] Remove class name repeated in subheadings (#2249)
+
+commit 56c599f71e8a9cfe77233e5dcd77ccfe72d81af8
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Thu Jul 5 20:22:47 2018 -0700
+
+ [algorithm.syn] Reorder after [algorithms.requirements] and
+ [algorithms.parallel], which apply to both <algorithm> and <numeric>.
+
+commit 8806777151719da531aae976c46f98c485bf0580
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jul 4 08:39:53 2018 +0200
+
+ [algorithms] Integrate requirements from [numeric.ops].
+
+commit e8d3d7029c5be1494016bc03e0004d0e9eeaa8cd
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jul 4 08:25:30 2018 +0200
+
+ Remove [class.copy] and adjust cross-references pointing there.
+
+ The normative statements that used to be contained in
+ [class.copy] were redundant with [dcl.init] and [over.ass].
+
+commit 006fb15de62c93b6e3de3d32648f276c9ec70181
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jul 4 00:29:28 2018 +0200
+
+ [class.derived,class.access,special] Move into [class], as appropriate.
+
+ P1076R1: Editorial clause reorganization
+
+commit 3c580cd204fde95a21de1830ace75d14d429f845
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jul 4 00:07:05 2018 +0200
+
+ [dcl.decl] Move into [dcl.dcl] as appropriate.
+
+ P1076R1: Editorial clause reorganization
+
+commit 40907944b775e4da980b69565dcbaa4bd494d347
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jul 4 00:00:51 2018 +0200
+
+ [namespace.udecl] Move one level up
+
+ P1076R1: Editorial clause reorganization
+
+commit f87c7fd1d9a258d043b7b22fb13ce6bdf6931a28
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jul 3 23:54:36 2018 +0200
+
+ [numeric.ops] Move into [algorithms], after [alg.sorting]
+
+ P1076R1: Editorial clause reorganization
+
+commit 40719643c5f237aecf0136a001cce1d85ceaaf59
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jul 3 23:48:00 2018 +0200
+
+ [localization] Move to before [input.output]
+
+ P1076R1: Editorial clause reorganization
+
+commit a41eef0a98e9727ca85ff12c99b27209969a62b8
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jul 3 23:37:46 2018 +0200
+
+ [time.general] Add summary table
+
+commit 63603768789149c9b46bac7e810ddfb618e8eefe
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jul 3 23:30:45 2018 +0200
+
+ [time] Promote to a top-level clause.
+
+ P1076R1: Editorial clause reorganization
+
+commit 006a9380cfe9e00bcee9b03884b3b4bf57bf6fa2
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jul 3 23:22:05 2018 +0200
+
+ [conv] Move as a subclause into [expr], immediately before [expr.arith.conv]
+
+ P1076R1: Editorial clause reorganization
+
+commit 70adb738f6edbc0697d1f26c72040d6b3a971421
+Author: Hubert Tong <hubert-reinterpretcast@users.noreply.github.com>
+Date: Thu Jul 5 16:22:22 2018 -0400
+
+ [intro.defs] Use https in hyperlink URL; see Directives, Part 2:2018 (#2248)
+
+commit 3fe46c716367d6e367b4c5acff344bce3f2a5cd2
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Fri May 11 11:53:45 2018 +0100
+
+ [class] Reformat paragraph defining standard-layout class
+
+ Move the note before the definition of M(X).
+ Use a nested list for the definition of M(X).
+ Move the example to a new paragraph.
+
+commit 0cac48775c1b1db4038cc0e456ccef81d5dd5fdc
+Author: timsong-cpp <rs2740@gmail.com>
+Date: Mon Jul 2 17:13:53 2018 -0400
+
+ [concepts.{lang,compare,callable}.general] Replace "section" with "subclause".
+
+commit 9db2f62e966224e8e749913871771dd4ac886c78
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 09:08:21 2018 +0200
+
+ [basic.start,except] Harmonize references to std::terminate
+
+commit 3846e6ba6592099145655420e3b88c6c874cd5fc
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 1 10:05:58 2018 +0200
+
+ [over.match.viable] Fix cross-reference to satisfaction of constraints
+
+commit 61e272c36350786e8b3fa1662efb0a8b9484cdd5
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Jun 14 11:08:25 2018 +0200
+
+ [dcl.init.ref] Avoid use of 'underlying type' for references
+
+commit c56870954b48305df89133a80e6ab8a21a0a90e9
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Mon Jul 2 17:10:38 2018 -0400
+
+ [temp.constr.constr], [iterator.requirements.general], [re.results.size] Replace "section" with "subclause"
+
+commit f3b625826ae894613c9ec47bd4e1874fc46e71d4
+Author: timsong-cpp <rs2740@gmail.com>
+Date: Mon Jul 2 17:05:50 2018 -0400
+
+ [concepts.object] Dissolve single-item subclauses. (#2240)
+
+ The following subclause headings have been removed:
+
+ [concept.movable]
+ [concept.copyable]
+ [concept.semiregular]
+ [concept.regular]
+
+ The content for these former subclauses now resides in the parent subclause, [concepts.object].
+
+commit 75c9148c3d810a825765aef9f04f9689f678f7bf
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Sat Jun 16 15:57:32 2018 -0400
+
+ [re.general] Refer to table as done in the other clauses
+
+commit 2fdaf88fcffd65ea2ccc4e032e288c74ac94bb7d
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jul 2 11:52:45 2018 -0700
+
+ [basic.lookup.unqual] Finesse "class definition" footnote to avoid
+ saying that a class definition is one of two components of the
+ definition of a class.
+
+commit 4d757ab4026f2b1af37ea1f3c6fb8fbd4c83f0dc
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sat Jun 30 00:23:57 2018 +0200
+
+ [class.mem] Define complete-class context
+
+ and use it, instead of having separate redundant lists
+ in [basic.scope.class] and [basic.lookup.unqual].
+
+commit ade8b020efbfa8fd220d1ed7f230850f2849d593
+Author: S. B. Tam <cpplearner@outlook.com>
+Date: Tue Jul 3 02:32:45 2018 +0800
+
+ [expr.prim.id.{un,}qual] A structured binding name is an lvalue (#2234)
+
+ Fix wording here to match corresponding wording in [dcl.struct.bind].
+
+commit 809a034ac0428dc71d3b07bb15c39a1131d2e3f8
+Author: Michael Adams <mdadams@ece.uvic.ca>
+Date: Mon Jul 2 11:30:48 2018 -0700
+
+ [class.copy.elision] Fix typo that accidentally makes example ill-formed
+
+commit 61b25c662399e7ebd126ee6771126aa29fed407e
+Author: timsong-cpp <rs2740@gmail.com>
+Date: Sat Jun 30 05:27:09 2018 -0400
+
+ [{i,o}{string,f}stream.cons] Remove unmatched parenthesis (#2233)
+
+commit 0420f57904322da8adc32890687dc914d5c06edc
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Jun 19 11:23:54 2018 +0200
+
+ [dcl.attr.contract] Introduce subheadings and reorder paragraphs to fit
+
+commit 492e6a79cd4b36488c248771b73b46ba54ec27a6
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Wed Jun 27 21:18:27 2018 -0400
+
+ [variant.get] Consistently place comma after "otherwise"
+
+commit 5326a0d1311682568eccd19b1f8c2512091a2a53
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Jun 28 12:42:25 2018 +0200
+
+ [input.iterators,fs.rec.dir.itr.members] Disambiguate phrasing for previous value of iterators
+
+commit 2f5d2cbcd69c0cb63bad481f44d32082dd68ea6c
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Jun 28 23:54:24 2018 +0200
+
+ [depr.locale.stdcvt.req] Add normative references for encoding forms
+
+commit 69d7e1ffeed2187c1986f727882e65890c6dfa0f
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 29 00:08:44 2018 +0200
+
+ [optional] Move requirements from header synopsis to class template
+
+commit 6116910802836c517ecde9237b6ffabcdafc26cf
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 29 00:15:09 2018 +0200
+
+ [basic.fundamental] Add definition of 'fundamental type'
+
+commit b65061ee7d81079e72b2467ac9307ba9a24aaf00
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 29 13:41:11 2018 +0200
+
+ [expr.prim.lambda,depr.capture.this] Replace 'lambda expression'
+
+ with the grammar term 'lambda-expression'.
+ Also remove the unused definition of 'local lambda expression'.
+
+commit 354fa005c1b8ad55ddd1bca31bf4f8bef67db46e
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri May 25 10:37:36 2018 +0200
+
+ [dcl.init,over.match.ctor] Clarify copy-initialization for empty arguments.
+
+ Also turn the enumeration of direct-initialization cases into
+ a bulleted list, referring to grammar non-terminals.
+
+commit 69259f9d29a571233908c4f9be5afc9b98e9a2e3
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri May 25 01:14:17 2018 +0200
+
+ Drop redundant 'expression'
+
+ when calling out a value category.
+
+commit 09f1354234154602dee9a0afc12f0b160bf455ea
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 29 13:59:12 2018 -0700
+
+ [dcl.attr.contract] Fix mention of odr-use of a parameter value to talk
+ about odr-use of the parameter instead; values can't be odr-used.
+
+ As agreed on the core reflector.
+
+commit 45fa09c5e38057571284c3eda52aa479afa0f3cb
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 29 17:38:17 2018 +0200
+
+ [temp.dep] Fix typo 'An expressions...' (#2181)
+
+commit 50a00f2776122a1328d29332f45e3ec20ee6d0fb
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 29 00:53:00 2018 +0200
+
+ [lex] Cite ISO/IEC 10646 correctly (#2226)
+
+commit 6f6a5dd6de12968f447940049d7fbf447e0ccf9f
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue May 8 13:29:32 2018 +0200
+
+ [atomics.types.operations] Avoid inappropriate use of 'underlying type'
+
+commit 35e17ec6e2f702be4c31fd99c058404223a865da
+Author: Casey Carter <Casey@Carter.net>
+Date: Thu Jun 28 12:28:20 2018 -0700
+
+ [algorithm.syn] Relocate the "partitions" algorithms (#2219)
+
+ Move the synopsis for the "partitions" algorithms between the "binary_search" family and the "merge" family, to agree with the order of the detailed specifications as reordered by #1245.
+
+commit 03e97ca6af73a842d38d40977a2630b0c978eade
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Apr 19 23:12:20 2018 +0200
+
+ [temp.arg.explicit,temp.mem] Clarify note about explicit template arguments
+
+ for conversion function templates and constructor templates.
+
+commit cdad8c27d822e5aec90b86a6e72e6f093d204924
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Apr 3 23:33:29 2018 +0200
+
+ [move.iterators] Dissolve single-item subclauses.
+
+commit 1f9524d9b2a2ec95e7b48ec82ff9782e2b79d413
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Wed Jun 27 22:42:53 2018 +0100
+
+ [support.limits.general] Fix typo: '<forwardlist>' should be '<forward_list>'
+
+commit e0d78d373e975ccbc7cd59d5b7292c48f920b959
+Author: Alisdair Meredith <public@alisdairm.net>
+Date: Wed Jun 27 17:33:20 2018 -0400
+
+ [span.overview] Fix reverse_iterator for span (#2112)
+
+ There is a common convention to omit 'std::' when not strictly needed,
+ other than for 'std::move' and 'std::forward'. A third case is for
+ 'reverse_iterator' and 'const_reverse_iterator' type aliases inside a
+ class definition, as the leading 'reverse_iterator' type alias hides
+ the 'std' version from the 'const_reverse_iterator' definition, and
+ subsequently fails to compile. This patch restore the class definition
+ to a safely copy/pastable state.
+
+ An additional review indicated this convention has been applied correctly
+ for every othert potential occurrence in the library.
+
+commit 33e8e2b3c5c2ae9e53ed656f7e3dfe874e55ede3
+Author: Casey Carter <Casey@Carter.net>
+Date: Wed Jun 27 14:32:34 2018 -0700
+
+ [output.iterators] Strike useless sentence from note (#2083)
+
+ There's no such thing as an "insert pointer," and the rest of this sentence isn't much better.
+
+commit fe3f46b976c8c19336f0007625fe3e487827ca55
+Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
+Date: Wed Jun 27 12:12:45 2018 -0700
+
+ Harmonize phrasings of "this destructor is trivial". (#2191)
+
+ Inspired by P0602 https://lichray.github.io/trivially_variant.html
+ Zhihao suggested that we harmonize "trivially destructible"
+ wording across the rest of the Standard.
+
+commit 14809d0b4b27395ea407734d00d0f6dc9c7b0c05
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 27 21:04:50 2018 +0200
+
+ [expr.spaceship] Fix typo for std::strong_equality::nonequal (#2216)
+
+commit 2954bfccb653504279f101cf1d8c7f9fb96947ff
+Author: Sergey Zubkov <cubbi@cubbi.com>
+Date: Wed Jun 27 15:03:49 2018 -0400
+
+ [diff.cpp17.depr] Fix typo from P0619R4 (#2217)
+
+ In the paper, "raw_memory_iterator" was meant to say "raw_storage_iterator".
+
+commit 264839261e3d0b0cb66415f2c1755d1f84d2cb3d
+Author: timsong-cpp <rs2740@gmail.com>
+Date: Wed Jun 27 06:51:41 2018 -0400
+
+ [istreambuf.iterator.proxy] correct title and remove default template argument (#2078)
+
+ This is a class, not a class template. Also, the default template argument is 1) redundant and 2) ill-formed for violating [temp.param]p12.
+
+commit e6794e6f167db93a519564d5fc986309d194e140
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 27 12:49:39 2018 +0200
+
+ [syserr] Remove class name repeated in subheadings (#2093)
+
+commit f0e7cdd3392e91b427764abf1c9c30058a457143
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 27 12:49:12 2018 +0200
+
+ [smartptr] Remove class name repeated in subheadings (#2092)
+
+commit a92cdcb6ca8aa43e49a54d22f8760e9ca9cbaad7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 27 12:48:03 2018 +0200
+
+ [vector.cons] vector(const Allocator&) should be noexcept (#2182)
+
+ This fixes an oversight in the wording of
+ "N4258: Cleaning‐up noexcept in the Library",
+ which updated the overview, but not the description.
+
+commit f4a6f328137fa59bf3aa319eb4ccb743b2205dfc
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 19:06:44 2018 -0700
+
+ [alg.sorting] Fix grammar.
+
+commit de4ddf0a8fa164c7b451b6bb500c492681a7738c
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 20:00:54 2018 -0700
+
+ [cpp.cond], [cpp.predefined], [support.limits.general] Add feature-test
+ macros from 2018-06 motions:
+
+ __has_cpp_attribute(assert)
+ __has_cpp_attribute(ensures)
+ __has_cpp_attribute(expects)
+ __cpp_explicit_bool
+ __cpp_nontype_template_parameter_class
+ __cpp_lib_atomic_ref
+ __cpp_lib_bit_cast
+ __cpp_lib_concepts
+ __cpp_lib_constexpr_swap_algorithms
+ __cpp_lib_list_remove_return_type
+
+ ... all with value 201806L.
+
+commit 1984951deba6caeb117300b198e349b0e9bf841c
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 18:24:56 2018 -0700
+
+ [meta.type.trans] Strike redundant and confusing note on type member of
+ basic_common_reference, and replace it with a clarifying description of
+ the primary template.
+
+commit a5a086fada4312ee1794a5d2cb65a7ce5ac284d4
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 17:51:24 2018 -0700
+
+ [meta.trans.other] Replace "(possibly cv) void" with just "cv void".
+
+ These two formulations mean the same thing.
+
+commit cc393db472ef7e89fa4e8bc8bcce6e44979efd5e
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 17:43:51 2018 -0700
+
+ [concept.strictweakorder] Fix grammar in note.
+
+commit 01f681dd376ec6285fae0253d21745999fd9557f
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 26 14:50:39 2018 -0700
+
+ [concept.equalitycomparable] Remove note that the equality-preserving
+ nature of == implies that == is reflexive. This turns out to not quite
+ be justified by the normative rules.
+
+commit fbc2eef266332b8dea52718640ceca7cde9d6c1f
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jun 25 18:25:06 2018 -0700
+
+ [concept.boolean] Reword satisfaction rules for Boolean to make them not
+ appear to depend on the "given" lvalues b1 and b2.
+
+commit d324da9c1ea4702dfb2d595390114d872f29089e
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jun 25 18:15:28 2018 -0700
+
+ [concept.destructible] Fix meaningless phrase "potentially-throwing,
+ even if non-throwing".
+
+ By definition, non-throwing is the opposite of potentially-throwing for
+ an exception-specification ([except.spec]p1).
+
+commit 4ac1f96f51c998846ce97e81c793484a52318357
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jun 25 17:34:27 2018 -0700
+
+ [concepts.equality] Add missing paragraph numbers, reorder implicit
+ expression variations in example for clarity and to fix overfull hbox.
+
+commit 60ae4bf7daae6802fefef5a5f32c1d2248a51334
+Author: Casey Carter <Casey@Carter.net>
+Date: Fri Jun 22 20:28:23 2018 -0700
+
+ [concepts] There need be no "there need be no subsumption relationship"
+
+ ... the core language rules already imply it.
+
+commit 11b6f1844a7b43a232d55442f4af7f9ce20faa45
+Author: Casey Carter <Casey@Carter.net>
+Date: Fri Jun 22 21:14:00 2018 -0700
+
+ [structure.requirements] Add paragraph explaining the typographical convention for requirement names
+
+commit bfaea046b5176152a86514a886a5b7ab66e4dffe
+Author: Casey Carter <Casey@Carter.net>
+Date: Wed Jun 20 09:39:06 2018 -0700
+
+ [rand.req.urng] Rework URBG requirements for clarity and simplicitly
+
+ ... by removing the redundance between the new concept and the "old" requirements.
+
+ Also fixup the reference in [rand.req.eng] to properly refer [rand.req.urng] instead of the requirements table. The table has been removed, and the reference should have been to the subclause in the first place to clearly incorporate the requirements outside of the table.
+
+commit def89125ccf441d2178e6159d6b9448f17045f6a
+Author: Casey Carter <Casey@Carter.net>
+Date: Wed Jun 20 11:21:43 2018 -0700
+
+ [meta.trans.other] Remove basic_common_reference requirement with no normative effect.
+
+ We already say that only T and U can be specialized. We do not need to
+ also say that TQual and UQual cannot be. Also clarify that users may
+ *partially* specialize basic_common_reference.
+
+commit 528d382ca9b350c3aece9a57e23a2560b7ba0651
+Author: Casey Carter <Casey@Carter.net>
+Date: Tue Jun 19 16:31:00 2018 -0700
+
+ [meta.trans.other] Make style of common_type and common_reference consistent
+
+ ...by tagging the specification of common_reference with "Note C" and basic_common_reference "Note D".
+
+ Also remove the allowance to specialize basic_common_reference "if at least one template parameter in the specialization depends on a program-defined type"; it's redundant with "...pursuant to [namespace.std]". (This is consistent with `common_type`'s wording.)
+
+commit 2aa8b236c8afe09272fba8d0767fbc6552b301b5
+Author: Casey Carter <Casey@Carter.net>
+Date: Tue Jun 19 16:06:03 2018 -0700
+
+ [structure.requirements] Rephrase para 8 for clarity
+
+commit d9c710c4f13c95d65f96d503bd45f11628fdf68a
+Author: Casey Carter <Casey@Carter.net>
+Date: Mon Jun 18 06:55:44 2018 -0700
+
+ [concepts.general][library.general] Concepts constrain template arguments, not parameters
+
+commit a818d5bfb084da10818b830d210d8bb4312912e4
+Author: Casey Carter <Casey@Carter.net>
+Date: Thu Jun 21 09:38:44 2018 -0700
+
+ [concepts.swappable] Correct example
+
+commit db9aee9ca04a192f32cd630cf3682d30c62a0bf7
+Author: Casey Carter <Casey@Carter.net>
+Date: Tue Jun 19 15:34:43 2018 -0700
+
+ [customization.point.object][meta.trans.other] Replace "user-defined" added by P0898R3 with "program-defined"
+
+ ...to be consistent with the intent of LWG2139
+
+commit 03f3764a071dfe30ef1137435a88ea036ca65c1f
+Author: Casey Carter <Casey@Carter.net>
+Date: Wed Jun 20 15:16:51 2018 -0700
+
+ [definitions] Redefine expression-equivalent per ISO directives
+
+ To be replaceable in context, and add a clarifying example.
+
+commit d119277cb8864be440a6e0445211c232e87f91a7
+Author: Casey Carter <Casey@Carter.net>
+Date: Thu Jun 21 09:18:24 2018 -0700
+
+ [concepts] Rephrase ocurrences of "must"
+
+commit 16b35d651de53654321b584eba2c6c4e126eb7d8
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 18:08:26 2018 -0700
+
+ [depr.c.headers] Undo P0619R4's removal of synopses for <ccomplex>,
+ <cstdalign>, <cstdbool>, and <ctgmath>.
+
+ Instead, repurpose these to be synopses for <complex.h>, <stdalign.h>,
+ <stdbool.h>, and <tgmath.h>, and move them into [depr.c.headers].
+ Also introduce a synopsis for <iso646.h>.
+
+ This avoids three of these five headers being specified as equivalent to
+ a non-existent <cfoo> header, and the other two missing a synopsis.
+
+commit cf0749742b9318143505f9ffe2d4dabb5420d727
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 17:17:41 2018 -0700
+
+ [diff.cpp17.library] Fix description of how to adjust code for the
+ removal of <ccomplex> and <ctgmath>.
+
+commit fa04176c01dd10105eec6590407b2c76384f5c52
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 17:06:40 2018 -0700
+
+ [diff.cpp17.library] Fix list of new headers compared to C++17.
+
+commit 9e80b6c69467fb2fb146637e1f0fca8b7495250f
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 16:59:45 2018 -0700
+
+ [diff.cpp17.except] Fix Rationale to be a rationale.
+
+ "This was retained for one additional C++ standard to ease transition"
+ is not a rationale for removing the feature now.
+
+commit 043ee628bc8accbe7f1ac4dc2210e88186bc95a4
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 16:41:51 2018 -0700
+
+ [diff.cpp17.except] Add a note that there is no longer a way to write
+ code that is non-throwing in both C++20 and C++03.
+
+commit fd244b515387efde9fb08ffe183985a38e93d184
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 16:29:19 2018 -0700
+
+ [diff.cpp03.language.support] Remove change described in p1, which is no
+ longer a possible change.
+
+ It is not possible to write a global replacement operator new or
+ operator delete in C++20 with code that is also valid C++03, because
+
+ a) operator new must be declared 'throw(std::bad_alloc)' in C++03 and
+ must be declared with no exception specification in C++11 onwards,
+ and
+ b) operator delete must be declared 'throw()' in C++03 and must be
+ declared 'noexcept' in C++20 onwards.
+
+ Therefore there is no code that is valid in C++03 and C++20 and changes
+ meaning due to the change identified in this section.
+
+ Instead, expand [diff.cpp03.language.support]p2 to explain that the
+ affected programs are simply not valid in C++20.
+
+commit 3e80cd4c07563639a8ca55d41d704701ae6d0eb4
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Jun 22 16:07:09 2018 -0700
+
+ [complex.special] Reorder defaulted complex copy constructor to
+ emphasize relationship between it and the converting constructors.
+
+commit 74539419429281072e1f8b787a0ce0dc2bb067db
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Thu Jun 21 20:09:23 2018 -0700
+
+ [atomics.ref] Reword introductory sentences to avoid overfull hbox.
+
+commit 3c21cfcfa1091a406d4b384e4677f0fa0e8ea75c
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Mon Jun 11 19:10:53 2018 +0200
+
+ [alg.shift] Avoid undefined iterator arithmetic on ForwardIterator.
+ Avoid using the undefined concept BidirectionalIterator.
+
+commit 949892305c88abd7c2ecb15a77bde3222366733d
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Mon Jun 11 23:43:22 2018 +0100
+
+ [structure.specifications] remove "implementation-defined" from example
+ mentioning [[expects]] and add cross-reference to [[expects]] attribute.
+
+commit 23c6b62f321d463792c54db38a89b335dc232f3e
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Mon Jun 11 23:41:37 2018 +0100
+
+ [structure.specifications] replace "paragraph" with "element"
+
+commit 4aa23529058e5f17f74e663ff189a1548812e009
+Author: Jonathan Wakely <cxx@kayari.org>
+Date: Mon Jun 11 23:37:31 2018 +0100
+
+ [res.on.required] replace "paragraph" with "element"
+
+commit 3b24b2dc75bd5b80d2c5fc1cb3fdb62ac3852d8d
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 19 17:13:17 2018 -0700
+
+ [diff.cpp17] Correct description of explicit(bool) compatibility.
+
+ Parenthesized names for explicit constructors and conversion functions
+ are still valid if the name doesn't immediately follow the explicit
+ keyword. Add an example using explicit(true) as a hint indicating how
+ to get the same effect.
+
+ Change affected subclauses from [dcl.fct] to the somewhat-more-precise
+ [class.ctor] and [class.conv.fct].
+
+commit 001a2011d172cce2784857a492e2c37e25ade7e9
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jun 18 18:19:39 2018 -0700
+
+ [dcl.attr.contract] Fix typeface of std::terminate in comment.
+
+commit 913c83a98735709462a49613f8993bca4042ed70
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 17 09:18:08 2018 +0200
+
+ [dcl.attr.contract] Move according to alphabetical sorting of headings
+
+commit 463ab8dc3726514b2adf8dcf6816262f58688da3
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 11:01:23 2018 +0200
+
+ [except.terminate] Clarify evaluation of a contract
+
+commit f2f60fd4c3f9810ae815a408e1fd3ac1462482c7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:53:18 2018 +0200
+
+ [temp.explicit] Remove redundant rules for contracts
+
+ given that [dcl.attr.grammar] already prohibits
+ attribute-specifier-seqs for an explicit instantiation.
+
+commit a7a0e115dbf5f149936a04f57b9dd3174c9efa6a
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:51:04 2018 +0200
+
+ [class.virtual] Fix comment in example
+
+commit ca0d62cc3d8c397d843fe1e1ae4a80f8fa389587
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:42:25 2018 +0200
+
+ [dcl.attr.contract] Fix sentence defining violation handler
+
+commit 0cd3f3dc072d736b4e8572311918bdccbb91e1f7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:33:54 2018 +0200
+
+ [dcl.attr.contract] Clarify evaluation of non-checked contracts
+
+commit 2930dc55b0c5573aad90c22e1909f98bb9bec4c2
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:18:18 2018 +0200
+
+ [dcl.attr.contract] Permit modifications of temporaries within the predicate.
+
+commit 87c3c20540b99708b02ce3dfc6a792a3fea454aa
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:17:19 2018 +0200
+
+ [dcl.attr.contract] Clarify that assertions may apply to a null statement
+
+commit 072f42df7b298c3677b2a1e8f1a4687d1e005ffc
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:10:53 2018 +0200
+
+ [dcl.attr.contract] Clarify rules on std::contract_violation
+
+commit 77579d2f9527552820dfc667867589da12adceda
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 10:08:09 2018 +0200
+
+ [dcl.attr.contract] Predicates of a contract are potentially evaluated,
+
+ as per the definition in [basic.def.odr], so turn the
+ redundant normative statement into a note.
+
+commit da24c5df270fc17a82b6767aef5baee94fba4a45
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Jun 15 09:43:43 2018 +0200
+
+ [basic.def.odr] Rephrase ODR rule for contracts
+
+commit 0fc2af6bbe05e16feb03e8f24651ea12e8a6997c
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 10 22:53:26 2018 +0200
+
+ [dcl.attr.contract] Reorder paragraphs for more coherence.
+
+ Also move rules on virtual functions to [class.virtual].
+ Rephase assertion checking along pre/postcondition checking.
+
+commit 42019fd86775859393e7e5edc7e8d4c2e64c8019
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 10 22:24:18 2018 +0200
+
+ [basic.def.odr] Rephrase build level and continuation mode requirements
+
+commit ac603143816388fa8fa12a8fb0802130b6643884
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 10 22:17:23 2018 +0200
+
+ [dcl.attr.contract] Rephrase comments in examples
+
+commit 19d07dec4cbe5ae86eb6231eb833d166c5939faf
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 10 22:14:46 2018 +0200
+
+ [except.terminate] Add contract violation with continuation mode off
+
+commit f28517ab52f7bf80879a7883fe08bb97020f80da
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Jun 10 21:17:50 2018 +0200
+
+ [dcl.attr.contract] Avoid duplication of 'renaming' in enumeration
+
+commit a8b8e534a7a5235157333f6a9f64c339e48e0e86
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Jun 11 15:56:16 2018 -0700
+
+ [basic.stc.dynamic.deallocation] Remove confusing note.
+
+ This note is only correct due to subtleties of later wording
+ (particularly that a destroying operator delete cannot be a function
+ template). Correcting it results in it simply duplicating existing
+ normative rules and not adding anything. So remove it instead.
+
+commit e4f579e421dac17ff36f98b2211d143991de7850
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 13 09:16:17 2018 +0200
+
+ [temp.arg.nontype] Fix example involving string literal
+
+ P0732R2 contained some changes to this section that were missing
+ explicit markup; apply those changes too. Also fix missing definition of
+ operator<=> in class type used as type of non-type template parameter.
+
+commit 5cca3b5015491a6c8b5d1d63f651073940d1145e
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 13 08:34:52 2018 +0200
+
+ [dcl.fct] Move function definition rule to [dcl.fct.def.general]
+
+ This is the rule that requires complete non-abstract
+ types function parameter or return types.
+
+commit b39b44b32394384edcc8f7f682274fbffd22f067
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Jun 13 08:28:26 2018 +0200
+
+ [temp.deduct] Forming an array of abstract class type is not deduction failure
+
+commit ba6cd4c525371eb98c60a025da21e5ca813b4a94
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Thu Jun 14 21:48:23 2018 +0100
+
+ [cpp.subst] Reword paragraph to simplify the logical structure and avoid ambiguous references.
+
+commit 4ce05424a8774e13b9958eb9cb9165da5b19edb0
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 12 16:27:40 2018 -0700
+
+ [depr.capture.this] Reorder so the order of Annex D matches the order of the main text
+
+commit 628a32db863ac10fe0fb4c45d6975a50f5497acf
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Jun 12 16:26:37 2018 -0700
+
+ [depr.capture.this] Replace "can" with "may".
+
+ This wording is describing permission, not capability, so should use "may".
+
+commit 5274b2ee4c558d39012a34d104be0d2139115c00
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Fri Jun 15 14:31:14 2018 +0100
+
+ [temp.deduct] Fixes from editorial review of CWG2293:
+
+ * Use "not valid" rather than "invalid", since only "valid" has been defined.
+ * Add an "otherwise" to improve flow.
+
+commit 0e771884acfdcb1dc693ef654f34cf717986f803
+Author: Jonathan Wakely <github@kayari.org>
+Date: Fri Jun 8 08:23:25 2018 +0100
+
+ [time.zone.db.remote] replace "this section" with "this subclause" (#2103)
+
+commit b9c5272c78fb312883cb548219b7fd2cb44280c7
+Author: Thomas Köppe <tkoeppe@google.com>
+Date: Thu Jun 7 23:24:37 2018 +0200
+
+ [cfenv.syn] Add "optional" markers for macros from the C library that are optional (as defined by C)
+
+commit aa77121b3aa9bc566b8d2e428cd21a28493ce57e
+Author: Alberto Barbati <2210776+iaanus@users.noreply.github.com>
+Date: Thu Jun 7 21:39:51 2018 +0200
+
+ [dcl.attr.likelihood] Fix error in example
+
+commit fbee1d521da91a798d81ecc09f110a0946239630
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Jun 7 21:36:42 2018 +0200
+
+ [views.general] Remove redundant introduction for span. (#2062)
+
+commit 069a179a0d54cad4b3d00f00eae532c827786894
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Mar 27 14:41:13 2018 +0200
+
+ [cmp.syn] Rename to [compare.syn] to match the header name
+
+commit 8a0060d0dcda8c63a2c432016bd038c75a8de9a1
+Author: Marc Mutz <marc.mutz@kdab.com>
+Date: Thu Jun 7 03:34:12 2018 +0200
+
+ [list.modifiers, forward.list.modifiers] Add missing 'to' in 'referred [to] by' (#2100)
+
+commit 57de3af9d24037d60d996b255c1ded8ee65387d2
+Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
+Date: Wed May 30 00:18:13 2018 -0700
+
+ [comparisons] Fix a typo in the note for `std::less`. (#2089)
+
+commit 61b6c21f218e3cbb9d15426975f1a26d8b72a7fe
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Thu May 10 14:40:22 2018 -0700
+
+ [class.expl.init] Fix example to account for guaranteed copy omission.
+
diff --git a/papers/n4764.md b/papers/n4764.md
new file mode 100644
index 0000000000..d4b7fddd1a
--- /dev/null
+++ b/papers/n4764.md
@@ -0,0 +1,1210 @@
+# N4764 Editors' Report -- Programming Languages -- C++
+
+2018-07-07
+Richard Smith (editor) (Google Inc)
+Thomas Köppe (co-editor) (Google DeepMind)
+Jens Maurer (co-editor)
+Dawn Perchik (co-editor) (Bright Side Computing, LLC)
+``
+
+## Acknowledgements
+
+Special thanks to Casey Carter for supplying a pull request to merge
+[P0898R3](http://wg21.link/p0898r3) (LWG motion 28),
+and working with us on editorial cleanups within the
+12 pages of added text.
+
+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.
+
+## New papers
+
+ * [N4762](http://wg21.link/n4762) is the current working draft for C++20. It replaces [N4750](http://wg21.link/n4750).
+ * N4764 is this Editors' Report.
+
+## Motions incorporated into working draft
+
+### Core working group motions
+
+CWG motion 1: [Core issue resolutions](http://wg21.link/p1113r0) for 6 issues in "ready" status applied:
+
+ * [2254](http://wg21.link/cwg2254) Standard-layout classes and bit-fields
+ * [2293](http://wg21.link/cwg2293) Requirements for *simple-template-id* used as a *class-name*
+ * [2294](http://wg21.link/cwg2294) Dependent `auto` static data members
+ * [2321](http://wg21.link/cwg2321) Conditional operator and cv-qualified class prvalues
+ * [2322](http://wg21.link/cwg2322) Substitution failure and lexical order
+ * [2339](http://wg21.link/cwg2339) Underspecified template arguments in structured bindings
+
+CWG motion 2: [Core issue resolutions](http://wg21.link/p1114r0) for 6 issues in "tentatively ready" status applied:
+
+ * [2233](http://wg21.link/cwg2233) Function parameter packs following default arguments
+ * [2249](http://wg21.link/cwg2249) *identifier*s and *id-expression*s
+ * [2285](http://wg21.link/cwg2285) Issues with structured bindings
+ * [2351](http://wg21.link/cwg2351) `void{}`
+ * [2356](http://wg21.link/cwg2356) Base class copy and move constructors should not be inherited
+ * [2359](http://wg21.link/cwg2359) Unintended copy initialization with designated initializers **(not a DR)**
+
+CWG motion 3: [P0806R2 "Deprecate implicit capture of `this` via `[=]`"](http://wg21.link/p0806r2)
+
+CWG motion 4: [P1042R1 "`__VA_OPT__` wording clarifications"](http://wg21.link/p1042r1)
+
+CWG motion 5: [P0929R2 "Checking for abstract class types"](http://wg21.link/p0929r2) applied, resolving 2 core issues:
+
+ * [1640](http://wg21.link/cwg1640) Array of abstract instance of class template
+ * [1646](http://wg21.link/cwg1646) *decltype-specifier*s, abstract classes, and deduction failure
+
+CWG motion 6: [P0732R2 "Class types in non-type template parameters"](http://wg21.link/p0732r2)
+
+CWG motion 7 was not approved
+
+CWG motion 8: [P1025R1 "Update the reference to the Unicode standard"](http://wg21.link/p1025r1)
+
+CWG motion 9: [P0528R3 "The curious case of padding bits, featuring atomic compare-and-exchange"](http://wg21.link/p0528r3)
+
+CWG motion 10: [P0722R3 "Efficient sized delete for variable sized classes"](http://wg21.link/p0722r3)
+
+CWG motion 11: [P1064R0 "Allowing virtual function calls in constant expressions"](http://wg21.link/p1064r0)
+
+CWG motion 12: [P1008R1 "Prohibit aggregates with user-declared constructors"](http://wg21.link/p1008r1)
+
+CWG motion 13: [P1120R0 "Consistency improvements for `<=>` and other comparison operators"](http://wg21.link/p1120r0)
+
+CWG motion 14: [P0542R5 "Contract-based programming"](http://wg21.link/p0542r5) **see below**
+
+CWG motion 15: [P0941R2 "Feature-test macros"](http://wg21.link/p0941r2) **see below**
+
+CWG motion 16: [P0892R2 "`explicit(bool)`"](http://wg21.link/p0892r2)
+
+### Library working group motions
+
+LWG motions 1-5 apply to the Parallelism TS
+
+LWG motions 6 and 7 apply to the Reflection TS
+
+LWG motions 8 and 9 apply to the Coroutines TS
+
+LWG motion 10 applies to the Networking TS
+
+LWG motion 11: [Library issue resolutions](http://wg21.link/p1082r0) for 14 issues in "Ready" and "Tentatively Ready" status applied:
+
+ * [2139](http://wg21.link/lwg2139) What is a user-defined type? **see below**
+ * [2970](http://wg21.link/lwg2970) Return type of `std::visit` misspecified
+ * [3058](http://wg21.link/lwg3058) Parallel `adjacent_difference` shouldn't require creating temporaries
+ * [3062](http://wg21.link/lwg3062) Unnecessary `decay_t` in `is_execution_policy_v` should be `remove_cvref_t`
+ * [3067](http://wg21.link/lwg3067) `recursive_directory_iterator::pop` must invalidate
+ * [3074](http://wg21.link/lwg3074) Non-member functions for `valarray` should only deduce from the `valarray`
+ * [3076](http://wg21.link/lwg3076) `basic_string` CTAD ambiguity
+ * [3079](http://wg21.link/lwg3079) [LWG 2935](http://wg21.link/lwg2935) forgot to fix the `existing_p` overloads of `create_directory`
+ * [3080](http://wg21.link/lwg3080) Floating point `from_chars` pattern specification breaks round-tripping
+ * [3083](http://wg21.link/lwg3083) What should `ios::iword(-1)` do?
+ * [3094](http://wg21.link/lwg3094) [time.duration.io]p4 makes surprising claims about encoding
+ * [3100](http://wg21.link/lwg3100) Unnecessary and confusing "empty span" wording
+ * [3102](http://wg21.link/lwg3102) Clarify `span` `iterator` and `const_iterator` behavior
+ * [3104](http://wg21.link/lwg3104) Fixing `duration` division
+ * Resolution of [3071](http://wg21.link/lwg3071) (`read_until` still refers to
+ "input sequence") from P1082R0 was not part of this motion, as it applies to
+ the Networking TS.
+
+LWG motion 12: [Library issue resolution](http://wg21.link/p0475r1) for 1 issue applied:
+
+ * [2511](http://wg21.link/lwg2511) Guaranteed copy elision for piecewise construction
+
+LWG motion 13: [P0476R2 "Bit-casting object representations"](http://wg21.link/p0476r2)
+
+LWG motion 14: [P0788R3 "Standard library specification in a concepts and contracts world"](http://wg21.link/p0788r3)
+
+LWG motion 15 was not approved
+
+LWG motion 16: [P0458R2 "Checking for existence of an element in associative containers"](http://wg21.link/p0458r2)
+
+LWG motion 17: [P0759R1 "`fpos` requirements"](http://wg21.link/p0759r1)
+
+LWG motion 18: [P1023R0 "`constexpr` comparison operators for `std::array`"](http://wg21.link/p1023r0)
+
+LWG motion 19: [P0769R2 "Add `shift` to ``"](http://wg21.link/p0769r2)
+
+LWG motion 20: [P0887R1 "The `identity` metafunction"](http://wg21.link/p0887r1)
+
+LWG motion 21: [P0879R0 "`constexpr` for `swap` and `swap`-related functions"](http://wg21.link/p0879r0) applied, resolving 1 issue:
+
+ * [2800](http://wg21.link/lwg2800) `constexpr` `swap`
+
+LWG motion 22: [P0758R1 "Implicit conversion traits and utility functions"](http://wg21.link/p0758r1)
+
+LWG motion 23: [P0556R3 "Integral power-of-2 operations"](http://wg21.link/p0556r3)
+
+LWG motion 24: [P0019R8 "`atomic_ref`"](http://wg21.link/p0019r8)
+
+LWG motion 25: [P0935R0 "Eradicating unnecessarily explicit default constructors from the standard library"](http://wg21.link/p0935r0)
+
+LWG motion 26: [P0646R1 "Improving the return value of `erase`-like algorithms"](http://wg21.link/p0646r1)
+
+LWG motion 27: [P0619R4 "Reviewing deprecated facilities of C++17 for C++20"](http://wg21.link/p0619r4) **see below**
+
+LWG motion 28: [P0898R3 "Standard library concepts"](http://wg21.link/p0898r3) **see below**
+
+## Notable editorial changes
+
+### CWG motion 14
+
+Subclause structure and paragraph order of [dcl.attr.contracts] was reworked.
+Several normatively-redundant statements were converted to notes or removed.
+
+### CWG motion 15
+
+Multiple papers moved at this meeting included suggested feature-test macros.
+However, these were not presented as editing instructions, because we did not
+have feature-test macros in the standard wording yet. After consultation with
+CWG and LWG, the following feature test macros have been added in addition to
+those listed in CWG motion 15 (all with value `201806L`):
+
+ * `__has_cpp_attribute(assert)`
+ * `__has_cpp_attribute(ensures)`
+ * `__has_cpp_attribute(expects)`
+ * `__cpp_explicit_bool`
+ * `__cpp_nontype_template_parameter_class`
+ * `__cpp_lib_atomic_ref`
+ * `__cpp_lib_bit_cast`
+ * `__cpp_lib_concepts`
+ * `__cpp_lib_constexpr_swap_algorithms`
+ * `__cpp_lib_list_remove_return_type`
+
+### CWG motions 16 and 12
+
+CWG motion 16 would have us change wording that was deleted by CWG motion 12.
+The requested change in CWG motion 16 (from teletype "`explicit`" to body font "explicit")
+was ignored.
+
+### LWG motion 11: issue 2139
+
+The underlying text has changed between the drafting of the resolution to this
+issue and its application. We believe every requested edit has been applied;
+however, an additional use of "user-defined type" has been added to
+[namespace.std] that should likely also have been covered by this wording.
+It has *not* been changed.
+
+### LWG motions 13 and 23
+
+These motions both introduce a `` header, but the organizational structure
+suggested by motion 23 doesn't make sense for the functionality
+added by motion 13.
+The wording of motion 23 has been rearranged to fit into
+the structure established by motion 13.
+
+### LWG motions 16
+
+Added the new `contains` member function for associative containers to the list
+of member function templates that do not participate in overload resolution
+unless the comparator is transparent, after consultation with LWG.
+
+### LWG motions 19 and 21
+
+LWG motion 19 adds a `shift_right` algorithm to ``
+as a non-`constexpr` function template.
+
+LWG motion 21 instructs that we mark
+all non-parallel algorithms in ``
+as `constexpr`.
+Naturally, however,
+its proposed wording change does not list the `shift_right` algorithm.
+After consultation with LWG, `shift_right` has been marked `constexpr`
+to satisfy the intent of LWG motion 21.
+
+### LWG motion 27
+
+Synopses for
+``,
+``,
+``, and
+``
+were not removed;
+instead, they have been repurposed as synopses for
+``,
+``,
+``, and
+``.
+(The latter used to be defined in terms of the former,
+but can no longer be specified in that way.)
+Also introduced a synopsis for ``.
+
+### LWG motion 28
+
+Clause labels shortened and simplified throughout.
+
+The single-item clauses [concept.movable], [concept.copyable],
+[concept.semiregular], and [concept.regular] have been merged into their
+parent, [concepts.object].
+
+The single-item clauses [concept.signed.int] and [concept.unsigned.int]
+have been merged into their parent, [concept.integral].
+
+Legacy concept names changed from *Cpp98Something* to *Cpp17Something*. Many of
+these concepts did not exist in C++98 (which in any case was revoked and
+replaced by C++03).
+
+Reworked "uniform random bit generator" requirements to describe them in terms
+of the `UniformRandomBitGenerator` concept.
+
+Removed "there need be no subsumption relationship" wording that is already
+implied by the core language rules for concepts.
+
+### Editorial paper [P1076R1 "Clause reorganization"](http://wg21.likn/p1076r1)
+
+The claue reorganization described in P1076R1 and discussed at the WG21
+Rapperswil meeting has been applied to the working draft, with the following
+modifications:
+
+[class.copy] was left containing only two paragraphs of text, neither of which
+had any normative impact. It has been removed.
+
+The top-level subclauses of [algorithms] have been reordered to make the
+description of the `` header fit better into its structure.
+
+Several paragraphs of [class] describing various properties of classes have
+been moved into a new subclause [class.prop] "Properties of clases".
+
+### Removal of single-item subclauses
+
+The single-item subclauses
+[move.iter.op=] and
+[move.iter.op.const]
+have been merged into [move.iter.cons].
+
+The single-item subclauses
+[move.iter.op.star],
+[move.iter.op.ref], and
+[move.iter.op.index]
+have been merged into [move.iter.elem].
+
+The single-item subclauses
+[move.iter.op.+],
+[move.iter.op.-],
+[move.iter.op.incr],
+[move.iter.op.+=],
+[move.iter.op.decr], and
+[move.iter.op.-=]
+have been merged into [move.iter.nav].
+
+The now-empty [move.iter.ops] has been removed.
+
+## Minor editorial fixes
+
+A log of editorial fixes made to the working draft since N4750 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/n4750...n4762).
+
+ commit afe115acc28e33e48e2ece9f850820d6faa51757
+ Author: Jens Maurer
+ Date: Fri Jul 6 10:47:19 2018 +0200
+
+ [class] Introduce a subheading 'Properties of classes'.
+
+ commit d3f80a4a994a66cc8148a6031d29182aad4f16f6
+ Author: Jens Maurer
+ Date: Sat Jul 7 00:49:56 2018 +0200
+
+ [namespace.udecl] Demote normative duplication to notes (#1976)
+
+ The effects of using-declarations naming member functions
+ are discussed in other parts of the standard.
+ The effects of initializing with an inherited constructor are
+ discussed elsewhere, too.
+
+ commit 9459c137f138f903d670e6689b3963f0a3f7d083
+ Author: Jens Maurer
+ Date: Fri Jul 6 10:40:09 2018 +0200
+
+ [time.point,time.duration] Remove class name repeated in subheadings (#2249)
+
+ commit 56c599f71e8a9cfe77233e5dcd77ccfe72d81af8
+ Author: Richard Smith
+ Date: Thu Jul 5 20:22:47 2018 -0700
+
+ [algorithm.syn] Reorder after [algorithms.requirements] and
+ [algorithms.parallel], which apply to both and .
+
+ commit 8806777151719da531aae976c46f98c485bf0580
+ Author: Jens Maurer
+ Date: Wed Jul 4 08:39:53 2018 +0200
+
+ [algorithms] Integrate requirements from [numeric.ops].
+
+ commit e8d3d7029c5be1494016bc03e0004d0e9eeaa8cd
+ Author: Jens Maurer
+ Date: Wed Jul 4 08:25:30 2018 +0200
+
+ Remove [class.copy] and adjust cross-references pointing there.
+
+ The normative statements that used to be contained in
+ [class.copy] were redundant with [dcl.init] and [over.ass].
+
+ commit 006fb15de62c93b6e3de3d32648f276c9ec70181
+ Author: Jens Maurer
+ Date: Wed Jul 4 00:29:28 2018 +0200
+
+ [class.derived,class.access,special] Move into [class], as appropriate.
+
+ P1076R1: Editorial clause reorganization
+
+ commit 3c580cd204fde95a21de1830ace75d14d429f845
+ Author: Jens Maurer
+ Date: Wed Jul 4 00:07:05 2018 +0200
+
+ [dcl.decl] Move into [dcl.dcl] as appropriate.
+
+ P1076R1: Editorial clause reorganization
+
+ commit 40907944b775e4da980b69565dcbaa4bd494d347
+ Author: Jens Maurer
+ Date: Wed Jul 4 00:00:51 2018 +0200
+
+ [namespace.udecl] Move one level up
+
+ P1076R1: Editorial clause reorganization
+
+ commit f87c7fd1d9a258d043b7b22fb13ce6bdf6931a28
+ Author: Jens Maurer
+ Date: Tue Jul 3 23:54:36 2018 +0200
+
+ [numeric.ops] Move into [algorithms], after [alg.sorting]
+
+ P1076R1: Editorial clause reorganization
+
+ commit 40719643c5f237aecf0136a001cce1d85ceaaf59
+ Author: Jens Maurer
+ Date: Tue Jul 3 23:48:00 2018 +0200
+
+ [localization] Move to before [input.output]
+
+ P1076R1: Editorial clause reorganization
+
+ commit a41eef0a98e9727ca85ff12c99b27209969a62b8
+ Author: Jens Maurer
+ Date: Tue Jul 3 23:37:46 2018 +0200
+
+ [time.general] Add summary table
+
+ commit 63603768789149c9b46bac7e810ddfb618e8eefe
+ Author: Jens Maurer
+ Date: Tue Jul 3 23:30:45 2018 +0200
+
+ [time] Promote to a top-level clause.
+
+ P1076R1: Editorial clause reorganization
+
+ commit 006a9380cfe9e00bcee9b03884b3b4bf57bf6fa2
+ Author: Jens Maurer
+ Date: Tue Jul 3 23:22:05 2018 +0200
+
+ [conv] Move as a subclause into [expr], immediately before [expr.arith.conv]
+
+ P1076R1: Editorial clause reorganization
+
+ commit 70adb738f6edbc0697d1f26c72040d6b3a971421
+ Author: Hubert Tong
+ Date: Thu Jul 5 16:22:22 2018 -0400
+
+ [intro.defs] Use https in hyperlink URL; see Directives, Part 2:2018 (#2248)
+
+ commit 3fe46c716367d6e367b4c5acff344bce3f2a5cd2
+ Author: Jonathan Wakely
+ Date: Fri May 11 11:53:45 2018 +0100
+
+ [class] Reformat paragraph defining standard-layout class
+
+ Move the note before the definition of M(X).
+ Use a nested list for the definition of M(X).
+ Move the example to a new paragraph.
+
+ commit 0cac48775c1b1db4038cc0e456ccef81d5dd5fdc
+ Author: timsong-cpp
+ Date: Mon Jul 2 17:13:53 2018 -0400
+
+ [concepts.{lang,compare,callable}.general] Replace "section" with "subclause".
+
+ commit 9db2f62e966224e8e749913871771dd4ac886c78
+ Author: Jens Maurer
+ Date: Fri Jun 15 09:08:21 2018 +0200
+
+ [basic.start,except] Harmonize references to std::terminate
+
+ commit 3846e6ba6592099145655420e3b88c6c874cd5fc
+ Author: Jens Maurer
+ Date: Fri Jun 1 10:05:58 2018 +0200
+
+ [over.match.viable] Fix cross-reference to satisfaction of constraints
+
+ commit 61e272c36350786e8b3fa1662efb0a8b9484cdd5
+ Author: Jens Maurer
+ Date: Thu Jun 14 11:08:25 2018 +0200
+
+ [dcl.init.ref] Avoid use of 'underlying type' for references
+
+ commit c56870954b48305df89133a80e6ab8a21a0a90e9
+ Author: Johel Ernesto Guerrero Peña
+ Date: Mon Jul 2 17:10:38 2018 -0400
+
+ [temp.constr.constr], [iterator.requirements.general], [re.results.size] Replace "section" with "subclause"
+
+ commit f3b625826ae894613c9ec47bd4e1874fc46e71d4
+ Author: timsong-cpp
+ Date: Mon Jul 2 17:05:50 2018 -0400
+
+ [concepts.object] Dissolve single-item subclauses. (#2240)
+
+ The following subclause headings have been removed:
+
+ [concept.movable]
+ [concept.copyable]
+ [concept.semiregular]
+ [concept.regular]
+
+ The content for these former subclauses now resides in the parent subclause, [concepts.object].
+
+ commit 75c9148c3d810a825765aef9f04f9689f678f7bf
+ Author: Johel Ernesto Guerrero Peña
+ Date: Sat Jun 16 15:57:32 2018 -0400
+
+ [re.general] Refer to table as done in the other clauses
+
+ commit 2fdaf88fcffd65ea2ccc4e032e288c74ac94bb7d
+ Author: Richard Smith
+ Date: Mon Jul 2 11:52:45 2018 -0700
+
+ [basic.lookup.unqual] Finesse "class definition" footnote to avoid
+ saying that a class definition is one of two components of the
+ definition of a class.
+
+ commit 4d757ab4026f2b1af37ea1f3c6fb8fbd4c83f0dc
+ Author: Jens Maurer
+ Date: Sat Jun 30 00:23:57 2018 +0200
+
+ [class.mem] Define complete-class context
+
+ and use it, instead of having separate redundant lists
+ in [basic.scope.class] and [basic.lookup.unqual].
+
+ commit ade8b020efbfa8fd220d1ed7f230850f2849d593
+ Author: S. B. Tam
+ Date: Tue Jul 3 02:32:45 2018 +0800
+
+ [expr.prim.id.{un,}qual] A structured binding name is an lvalue (#2234)
+
+ Fix wording here to match corresponding wording in [dcl.struct.bind].
+
+ commit 809a034ac0428dc71d3b07bb15c39a1131d2e3f8
+ Author: Michael Adams
+ Date: Mon Jul 2 11:30:48 2018 -0700
+
+ [class.copy.elision] Fix typo that accidentally makes example ill-formed
+
+ commit 61b25c662399e7ebd126ee6771126aa29fed407e
+ Author: timsong-cpp
+ Date: Sat Jun 30 05:27:09 2018 -0400
+
+ [{i,o}{string,f}stream.cons] Remove unmatched parenthesis (#2233)
+
+ commit 0420f57904322da8adc32890687dc914d5c06edc
+ Author: Jens Maurer
+ Date: Tue Jun 19 11:23:54 2018 +0200
+
+ [dcl.attr.contract] Introduce subheadings and reorder paragraphs to fit
+
+ commit 492e6a79cd4b36488c248771b73b46ba54ec27a6
+ Author: Johel Ernesto Guerrero Peña
+ Date: Wed Jun 27 21:18:27 2018 -0400
+
+ [variant.get] Consistently place comma after "otherwise"
+
+ commit 5326a0d1311682568eccd19b1f8c2512091a2a53
+ Author: Jens Maurer
+ Date: Thu Jun 28 12:42:25 2018 +0200
+
+ [input.iterators,fs.rec.dir.itr.members] Disambiguate phrasing for previous value of iterators
+
+ commit 2f5d2cbcd69c0cb63bad481f44d32082dd68ea6c
+ Author: Jens Maurer
+ Date: Thu Jun 28 23:54:24 2018 +0200
+
+ [depr.locale.stdcvt.req] Add normative references for encoding forms
+
+ commit 69d7e1ffeed2187c1986f727882e65890c6dfa0f
+ Author: Jens Maurer
+ Date: Fri Jun 29 00:08:44 2018 +0200
+
+ [optional] Move requirements from header synopsis to class template
+
+ commit 6116910802836c517ecde9237b6ffabcdafc26cf
+ Author: Jens Maurer
+ Date: Fri Jun 29 00:15:09 2018 +0200
+
+ [basic.fundamental] Add definition of 'fundamental type'
+
+ commit b65061ee7d81079e72b2467ac9307ba9a24aaf00
+ Author: Jens Maurer
+ Date: Fri Jun 29 13:41:11 2018 +0200
+
+ [expr.prim.lambda,depr.capture.this] Replace 'lambda expression'
+
+ with the grammar term 'lambda-expression'.
+ Also remove the unused definition of 'local lambda expression'.
+
+ commit 354fa005c1b8ad55ddd1bca31bf4f8bef67db46e
+ Author: Jens Maurer
+ Date: Fri May 25 10:37:36 2018 +0200
+
+ [dcl.init,over.match.ctor] Clarify copy-initialization for empty arguments.
+
+ Also turn the enumeration of direct-initialization cases into
+ a bulleted list, referring to grammar non-terminals.
+
+ commit 69259f9d29a571233908c4f9be5afc9b98e9a2e3
+ Author: Jens Maurer
+ Date: Fri May 25 01:14:17 2018 +0200
+
+ Drop redundant 'expression'
+
+ when calling out a value category.
+
+ commit 09f1354234154602dee9a0afc12f0b160bf455ea
+ Author: Richard Smith
+ Date: Fri Jun 29 13:59:12 2018 -0700
+
+ [dcl.attr.contract] Fix mention of odr-use of a parameter value to talk
+ about odr-use of the parameter instead; values can't be odr-used.
+
+ As agreed on the core reflector.
+
+ commit 45fa09c5e38057571284c3eda52aa479afa0f3cb
+ Author: Jens Maurer
+ Date: Fri Jun 29 17:38:17 2018 +0200
+
+ [temp.dep] Fix typo 'An expressions...' (#2181)
+
+ commit 50a00f2776122a1328d29332f45e3ec20ee6d0fb
+ Author: Jens Maurer
+ Date: Fri Jun 29 00:53:00 2018 +0200
+
+ [lex] Cite ISO/IEC 10646 correctly (#2226)
+
+ commit 6f6a5dd6de12968f447940049d7fbf447e0ccf9f
+ Author: Jens Maurer
+ Date: Tue May 8 13:29:32 2018 +0200
+
+ [atomics.types.operations] Avoid inappropriate use of 'underlying type'
+
+ commit 35e17ec6e2f702be4c31fd99c058404223a865da
+ Author: Casey Carter
+ Date: Thu Jun 28 12:28:20 2018 -0700
+
+ [algorithm.syn] Relocate the "partitions" algorithms (#2219)
+
+ Move the synopsis for the "partitions" algorithms between the "binary_search" family and the "merge" family, to agree with the order of the detailed specifications as reordered by #1245.
+
+ commit 03e97ca6af73a842d38d40977a2630b0c978eade
+ Author: Jens Maurer
+ Date: Thu Apr 19 23:12:20 2018 +0200
+
+ [temp.arg.explicit,temp.mem] Clarify note about explicit template arguments
+
+ for conversion function templates and constructor templates.
+
+ commit cdad8c27d822e5aec90b86a6e72e6f093d204924
+ Author: Jens Maurer
+ Date: Tue Apr 3 23:33:29 2018 +0200
+
+ [move.iterators] Dissolve single-item subclauses.
+
+ commit 1f9524d9b2a2ec95e7b48ec82ff9782e2b79d413
+ Author: Thomas Köppe
+ Date: Wed Jun 27 22:42:53 2018 +0100
+
+ [support.limits.general] Fix typo: '' should be ''
+
+ commit e0d78d373e975ccbc7cd59d5b7292c48f920b959
+ Author: Alisdair Meredith
+ Date: Wed Jun 27 17:33:20 2018 -0400
+
+ [span.overview] Fix reverse_iterator for span (#2112)
+
+ There is a common convention to omit 'std::' when not strictly needed,
+ other than for 'std::move' and 'std::forward'. A third case is for
+ 'reverse_iterator' and 'const_reverse_iterator' type aliases inside a
+ class definition, as the leading 'reverse_iterator' type alias hides
+ the 'std' version from the 'const_reverse_iterator' definition, and
+ subsequently fails to compile. This patch restore the class definition
+ to a safely copy/pastable state.
+
+ An additional review indicated this convention has been applied correctly
+ for every othert potential occurrence in the library.
+
+ commit 33e8e2b3c5c2ae9e53ed656f7e3dfe874e55ede3
+ Author: Casey Carter
+ Date: Wed Jun 27 14:32:34 2018 -0700
+
+ [output.iterators] Strike useless sentence from note (#2083)
+
+ There's no such thing as an "insert pointer," and the rest of this sentence isn't much better.
+
+ commit fe3f46b976c8c19336f0007625fe3e487827ca55
+ Author: Arthur O'Dwyer
+ Date: Wed Jun 27 12:12:45 2018 -0700
+
+ Harmonize phrasings of "this destructor is trivial". (#2191)
+
+ Inspired by P0602 https://lichray.github.io/trivially_variant.html
+ Zhihao suggested that we harmonize "trivially destructible"
+ wording across the rest of the Standard.
+
+ commit 14809d0b4b27395ea407734d00d0f6dc9c7b0c05
+ Author: Jens Maurer
+ Date: Wed Jun 27 21:04:50 2018 +0200
+
+ [expr.spaceship] Fix typo for std::strong_equality::nonequal (#2216)
+
+ commit 2954bfccb653504279f101cf1d8c7f9fb96947ff
+ Author: Sergey Zubkov
+ Date: Wed Jun 27 15:03:49 2018 -0400
+
+ [diff.cpp17.depr] Fix typo from P0619R4 (#2217)
+
+ In the paper, "raw_memory_iterator" was meant to say "raw_storage_iterator".
+
+ commit 264839261e3d0b0cb66415f2c1755d1f84d2cb3d
+ Author: timsong-cpp
+ Date: Wed Jun 27 06:51:41 2018 -0400
+
+ [istreambuf.iterator.proxy] correct title and remove default template argument (#2078)
+
+ This is a class, not a class template. Also, the default template argument is 1) redundant and 2) ill-formed for violating [temp.param]p12.
+
+ commit e6794e6f167db93a519564d5fc986309d194e140
+ Author: Jens Maurer
+ Date: Wed Jun 27 12:49:39 2018 +0200
+
+ [syserr] Remove class name repeated in subheadings (#2093)
+
+ commit f0e7cdd3392e91b427764abf1c9c30058a457143
+ Author: Jens Maurer
+ Date: Wed Jun 27 12:49:12 2018 +0200
+
+ [smartptr] Remove class name repeated in subheadings (#2092)
+
+ commit a92cdcb6ca8aa43e49a54d22f8760e9ca9cbaad7
+ Author: Jens Maurer
+ Date: Wed Jun 27 12:48:03 2018 +0200
+
+ [vector.cons] vector(const Allocator&) should be noexcept (#2182)
+
+ This fixes an oversight in the wording of
+ "N4258: Cleaning‐up noexcept in the Library",
+ which updated the overview, but not the description.
+
+ commit f4a6f328137fa59bf3aa319eb4ccb743b2205dfc
+ Author: Richard Smith
+ Date: Tue Jun 26 19:06:44 2018 -0700
+
+ [alg.sorting] Fix grammar.
+
+ commit de4ddf0a8fa164c7b451b6bb500c492681a7738c
+ Author: Richard Smith
+ Date: Tue Jun 26 20:00:54 2018 -0700
+
+ [cpp.cond], [cpp.predefined], [support.limits.general] Add feature-test
+ macros from 2018-06 motions:
+
+ __has_cpp_attribute(assert)
+ __has_cpp_attribute(ensures)
+ __has_cpp_attribute(expects)
+ __cpp_explicit_bool
+ __cpp_nontype_template_parameter_class
+ __cpp_lib_atomic_ref
+ __cpp_lib_bit_cast
+ __cpp_lib_concepts
+ __cpp_lib_constexpr_swap_algorithms
+ __cpp_lib_list_remove_return_type
+
+ ... all with value 201806L.
+
+ commit 1984951deba6caeb117300b198e349b0e9bf841c
+ Author: Richard Smith
+ Date: Tue Jun 26 18:24:56 2018 -0700
+
+ [meta.type.trans] Strike redundant and confusing note on type member of
+ basic_common_reference, and replace it with a clarifying description of
+ the primary template.
+
+ commit a5a086fada4312ee1794a5d2cb65a7ce5ac284d4
+ Author: Richard Smith
+ Date: Tue Jun 26 17:51:24 2018 -0700
+
+ [meta.trans.other] Replace "(possibly cv) void" with just "cv void".
+
+ These two formulations mean the same thing.
+
+ commit cc393db472ef7e89fa4e8bc8bcce6e44979efd5e
+ Author: Richard Smith
+ Date: Tue Jun 26 17:43:51 2018 -0700
+
+ [concept.strictweakorder] Fix grammar in note.
+
+ commit 01f681dd376ec6285fae0253d21745999fd9557f
+ Author: Richard Smith
+ Date: Tue Jun 26 14:50:39 2018 -0700
+
+ [concept.equalitycomparable] Remove note that the equality-preserving
+ nature of == implies that == is reflexive. This turns out to not quite
+ be justified by the normative rules.
+
+ commit fbc2eef266332b8dea52718640ceca7cde9d6c1f
+ Author: Richard Smith
+ Date: Mon Jun 25 18:25:06 2018 -0700
+
+ [concept.boolean] Reword satisfaction rules for Boolean to make them not
+ appear to depend on the "given" lvalues b1 and b2.
+
+ commit d324da9c1ea4702dfb2d595390114d872f29089e
+ Author: Richard Smith
+ Date: Mon Jun 25 18:15:28 2018 -0700
+
+ [concept.destructible] Fix meaningless phrase "potentially-throwing,
+ even if non-throwing".
+
+ By definition, non-throwing is the opposite of potentially-throwing for
+ an exception-specification ([except.spec]p1).
+
+ commit 4ac1f96f51c998846ce97e81c793484a52318357
+ Author: Richard Smith
+ Date: Mon Jun 25 17:34:27 2018 -0700
+
+ [concepts.equality] Add missing paragraph numbers, reorder implicit
+ expression variations in example for clarity and to fix overfull hbox.
+
+ commit 60ae4bf7daae6802fefef5a5f32c1d2248a51334
+ Author: Casey Carter
+ Date: Fri Jun 22 20:28:23 2018 -0700
+
+ [concepts] There need be no "there need be no subsumption relationship"
+
+ ... the core language rules already imply it.
+
+ commit 11b6f1844a7b43a232d55442f4af7f9ce20faa45
+ Author: Casey Carter
+ Date: Fri Jun 22 21:14:00 2018 -0700
+
+ [structure.requirements] Add paragraph explaining the typographical convention for requirement names
+
+ commit bfaea046b5176152a86514a886a5b7ab66e4dffe
+ Author: Casey Carter
+ Date: Wed Jun 20 09:39:06 2018 -0700
+
+ [rand.req.urng] Rework URBG requirements for clarity and simplicitly
+
+ ... by removing the redundance between the new concept and the "old" requirements.
+
+ Also fixup the reference in [rand.req.eng] to properly refer [rand.req.urng] instead of the requirements table. The table has been removed, and the reference should have been to the subclause in the first place to clearly incorporate the requirements outside of the table.
+
+ commit def89125ccf441d2178e6159d6b9448f17045f6a
+ Author: Casey Carter
+ Date: Wed Jun 20 11:21:43 2018 -0700
+
+ [meta.trans.other] Remove basic_common_reference requirement with no normative effect.
+
+ We already say that only T and U can be specialized. We do not need to
+ also say that TQual and UQual cannot be. Also clarify that users may
+ *partially* specialize basic_common_reference.
+
+ commit 528d382ca9b350c3aece9a57e23a2560b7ba0651
+ Author: Casey Carter
+ Date: Tue Jun 19 16:31:00 2018 -0700
+
+ [meta.trans.other] Make style of common_type and common_reference consistent
+
+ ...by tagging the specification of common_reference with "Note C" and basic_common_reference "Note D".
+
+ Also remove the allowance to specialize basic_common_reference "if at least one template parameter in the specialization depends on a program-defined type"; it's redundant with "...pursuant to [namespace.std]". (This is consistent with `common_type`'s wording.)
+
+ commit 2aa8b236c8afe09272fba8d0767fbc6552b301b5
+ Author: Casey Carter
+ Date: Tue Jun 19 16:06:03 2018 -0700
+
+ [structure.requirements] Rephrase para 8 for clarity
+
+ commit d9c710c4f13c95d65f96d503bd45f11628fdf68a
+ Author: Casey Carter
+ Date: Mon Jun 18 06:55:44 2018 -0700
+
+ [concepts.general][library.general] Concepts constrain template arguments, not parameters
+
+ commit a818d5bfb084da10818b830d210d8bb4312912e4
+ Author: Casey Carter
+ Date: Thu Jun 21 09:38:44 2018 -0700
+
+ [concepts.swappable] Correct example
+
+ commit db9aee9ca04a192f32cd630cf3682d30c62a0bf7
+ Author: Casey Carter
+ Date: Tue Jun 19 15:34:43 2018 -0700
+
+ [customization.point.object][meta.trans.other] Replace "user-defined" added by P0898R3 with "program-defined"
+
+ ...to be consistent with the intent of LWG2139
+
+ commit 03f3764a071dfe30ef1137435a88ea036ca65c1f
+ Author: Casey Carter
+ Date: Wed Jun 20 15:16:51 2018 -0700
+
+ [definitions] Redefine expression-equivalent per ISO directives
+
+ To be replaceable in context, and add a clarifying example.
+
+ commit d119277cb8864be440a6e0445211c232e87f91a7
+ Author: Casey Carter
+ Date: Thu Jun 21 09:18:24 2018 -0700
+
+ [concepts] Rephrase ocurrences of "must"
+
+ commit 16b35d651de53654321b584eba2c6c4e126eb7d8
+ Author: Richard Smith
+ Date: Fri Jun 22 18:08:26 2018 -0700
+
+ [depr.c.headers] Undo P0619R4's removal of synopses for ,
+ , , and .
+
+ Instead, repurpose these to be synopses for , ,
+ , and , and move them into [depr.c.headers].
+ Also introduce a synopsis for .
+
+ This avoids three of these five headers being specified as equivalent to
+ a non-existent header, and the other two missing a synopsis.
+
+ commit cf0749742b9318143505f9ffe2d4dabb5420d727
+ Author: Richard Smith
+ Date: Fri Jun 22 17:17:41 2018 -0700
+
+ [diff.cpp17.library] Fix description of how to adjust code for the
+ removal of and .
+
+ commit fa04176c01dd10105eec6590407b2c76384f5c52
+ Author: Richard Smith
+ Date: Fri Jun 22 17:06:40 2018 -0700
+
+ [diff.cpp17.library] Fix list of new headers compared to C++17.
+
+ commit 9e80b6c69467fb2fb146637e1f0fca8b7495250f
+ Author: Richard Smith
+ Date: Fri Jun 22 16:59:45 2018 -0700
+
+ [diff.cpp17.except] Fix Rationale to be a rationale.
+
+ "This was retained for one additional C++ standard to ease transition"
+ is not a rationale for removing the feature now.
+
+ commit 043ee628bc8accbe7f1ac4dc2210e88186bc95a4
+ Author: Richard Smith
+ Date: Fri Jun 22 16:41:51 2018 -0700
+
+ [diff.cpp17.except] Add a note that there is no longer a way to write
+ code that is non-throwing in both C++20 and C++03.
+
+ commit fd244b515387efde9fb08ffe183985a38e93d184
+ Author: Richard Smith
+ Date: Fri Jun 22 16:29:19 2018 -0700
+
+ [diff.cpp03.language.support] Remove change described in p1, which is no
+ longer a possible change.
+
+ It is not possible to write a global replacement operator new or
+ operator delete in C++20 with code that is also valid C++03, because
+
+ a) operator new must be declared 'throw(std::bad_alloc)' in C++03 and
+ must be declared with no exception specification in C++11 onwards,
+ and
+ b) operator delete must be declared 'throw()' in C++03 and must be
+ declared 'noexcept' in C++20 onwards.
+
+ Therefore there is no code that is valid in C++03 and C++20 and changes
+ meaning due to the change identified in this section.
+
+ Instead, expand [diff.cpp03.language.support]p2 to explain that the
+ affected programs are simply not valid in C++20.
+
+ commit 3e80cd4c07563639a8ca55d41d704701ae6d0eb4
+ Author: Richard Smith
+ Date: Fri Jun 22 16:07:09 2018 -0700
+
+ [complex.special] Reorder defaulted complex copy constructor to
+ emphasize relationship between it and the converting constructors.
+
+ commit 74539419429281072e1f8b787a0ce0dc2bb067db
+ Author: Richard Smith
+ Date: Thu Jun 21 20:09:23 2018 -0700
+
+ [atomics.ref] Reword introductory sentences to avoid overfull hbox.
+
+ commit 3c21cfcfa1091a406d4b384e4677f0fa0e8ea75c
+ Author: Jens Maurer
+ Date: Mon Jun 11 19:10:53 2018 +0200
+
+ [alg.shift] Avoid undefined iterator arithmetic on ForwardIterator.
+ Avoid using the undefined concept BidirectionalIterator.
+
+ commit 949892305c88abd7c2ecb15a77bde3222366733d
+ Author: Jonathan Wakely
+ Date: Mon Jun 11 23:43:22 2018 +0100
+
+ [structure.specifications] remove "implementation-defined" from example
+ mentioning [[expects]] and add cross-reference to [[expects]] attribute.
+
+ commit 23c6b62f321d463792c54db38a89b335dc232f3e
+ Author: Jonathan Wakely
+ Date: Mon Jun 11 23:41:37 2018 +0100
+
+ [structure.specifications] replace "paragraph" with "element"
+
+ commit 4aa23529058e5f17f74e663ff189a1548812e009
+ Author: Jonathan Wakely
+ Date: Mon Jun 11 23:37:31 2018 +0100
+
+ [res.on.required] replace "paragraph" with "element"
+
+ commit 3b24b2dc75bd5b80d2c5fc1cb3fdb62ac3852d8d
+ Author: Richard Smith
+ Date: Tue Jun 19 17:13:17 2018 -0700
+
+ [diff.cpp17] Correct description of explicit(bool) compatibility.
+
+ Parenthesized names for explicit constructors and conversion functions
+ are still valid if the name doesn't immediately follow the explicit
+ keyword. Add an example using explicit(true) as a hint indicating how
+ to get the same effect.
+
+ Change affected subclauses from [dcl.fct] to the somewhat-more-precise
+ [class.ctor] and [class.conv.fct].
+
+ commit 001a2011d172cce2784857a492e2c37e25ade7e9
+ Author: Richard Smith
+ Date: Mon Jun 18 18:19:39 2018 -0700
+
+ [dcl.attr.contract] Fix typeface of std::terminate in comment.
+
+ commit 913c83a98735709462a49613f8993bca4042ed70
+ Author: Jens Maurer
+ Date: Sun Jun 17 09:18:08 2018 +0200
+
+ [dcl.attr.contract] Move according to alphabetical sorting of headings
+
+ commit 463ab8dc3726514b2adf8dcf6816262f58688da3
+ Author: Jens Maurer
+ Date: Fri Jun 15 11:01:23 2018 +0200
+
+ [except.terminate] Clarify evaluation of a contract
+
+ commit f2f60fd4c3f9810ae815a408e1fd3ac1462482c7
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:53:18 2018 +0200
+
+ [temp.explicit] Remove redundant rules for contracts
+
+ given that [dcl.attr.grammar] already prohibits
+ attribute-specifier-seqs for an explicit instantiation.
+
+ commit a7a0e115dbf5f149936a04f57b9dd3174c9efa6a
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:51:04 2018 +0200
+
+ [class.virtual] Fix comment in example
+
+ commit ca0d62cc3d8c397d843fe1e1ae4a80f8fa389587
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:42:25 2018 +0200
+
+ [dcl.attr.contract] Fix sentence defining violation handler
+
+ commit 0cd3f3dc072d736b4e8572311918bdccbb91e1f7
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:33:54 2018 +0200
+
+ [dcl.attr.contract] Clarify evaluation of non-checked contracts
+
+ commit 2930dc55b0c5573aad90c22e1909f98bb9bec4c2
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:18:18 2018 +0200
+
+ [dcl.attr.contract] Permit modifications of temporaries within the predicate.
+
+ commit 87c3c20540b99708b02ce3dfc6a792a3fea454aa
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:17:19 2018 +0200
+
+ [dcl.attr.contract] Clarify that assertions may apply to a null statement
+
+ commit 072f42df7b298c3677b2a1e8f1a4687d1e005ffc
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:10:53 2018 +0200
+
+ [dcl.attr.contract] Clarify rules on std::contract_violation
+
+ commit 77579d2f9527552820dfc667867589da12adceda
+ Author: Jens Maurer
+ Date: Fri Jun 15 10:08:09 2018 +0200
+
+ [dcl.attr.contract] Predicates of a contract are potentially evaluated,
+
+ as per the definition in [basic.def.odr], so turn the
+ redundant normative statement into a note.
+
+ commit da24c5df270fc17a82b6767aef5baee94fba4a45
+ Author: Jens Maurer
+ Date: Fri Jun 15 09:43:43 2018 +0200
+
+ [basic.def.odr] Rephrase ODR rule for contracts
+
+ commit 0fc2af6bbe05e16feb03e8f24651ea12e8a6997c
+ Author: Jens Maurer
+ Date: Sun Jun 10 22:53:26 2018 +0200
+
+ [dcl.attr.contract] Reorder paragraphs for more coherence.
+
+ Also move rules on virtual functions to [class.virtual].
+ Rephase assertion checking along pre/postcondition checking.
+
+ commit 42019fd86775859393e7e5edc7e8d4c2e64c8019
+ Author: Jens Maurer
+ Date: Sun Jun 10 22:24:18 2018 +0200
+
+ [basic.def.odr] Rephrase build level and continuation mode requirements
+
+ commit ac603143816388fa8fa12a8fb0802130b6643884
+ Author: Jens Maurer
+ Date: Sun Jun 10 22:17:23 2018 +0200
+
+ [dcl.attr.contract] Rephrase comments in examples
+
+ commit 19d07dec4cbe5ae86eb6231eb833d166c5939faf
+ Author: Jens Maurer
+ Date: Sun Jun 10 22:14:46 2018 +0200
+
+ [except.terminate] Add contract violation with continuation mode off
+
+ commit f28517ab52f7bf80879a7883fe08bb97020f80da
+ Author: Jens Maurer
+ Date: Sun Jun 10 21:17:50 2018 +0200
+
+ [dcl.attr.contract] Avoid duplication of 'renaming' in enumeration
+
+ commit a8b8e534a7a5235157333f6a9f64c339e48e0e86
+ Author: Richard Smith
+ Date: Mon Jun 11 15:56:16 2018 -0700
+
+ [basic.stc.dynamic.deallocation] Remove confusing note.
+
+ This note is only correct due to subtleties of later wording
+ (particularly that a destroying operator delete cannot be a function
+ template). Correcting it results in it simply duplicating existing
+ normative rules and not adding anything. So remove it instead.
+
+ commit e4f579e421dac17ff36f98b2211d143991de7850
+ Author: Jens Maurer
+ Date: Wed Jun 13 09:16:17 2018 +0200
+
+ [temp.arg.nontype] Fix example involving string literal
+
+ P0732R2 contained some changes to this section that were missing
+ explicit markup; apply those changes too. Also fix missing definition of
+ operator<=> in class type used as type of non-type template parameter.
+
+ commit 5cca3b5015491a6c8b5d1d63f651073940d1145e
+ Author: Jens Maurer
+ Date: Wed Jun 13 08:34:52 2018 +0200
+
+ [dcl.fct] Move function definition rule to [dcl.fct.def.general]
+
+ This is the rule that requires complete non-abstract
+ types function parameter or return types.
+
+ commit b39b44b32394384edcc8f7f682274fbffd22f067
+ Author: Jens Maurer
+ Date: Wed Jun 13 08:28:26 2018 +0200
+
+ [temp.deduct] Forming an array of abstract class type is not deduction failure
+
+ commit ba6cd4c525371eb98c60a025da21e5ca813b4a94
+ Author: Thomas Köppe
+ Date: Thu Jun 14 21:48:23 2018 +0100
+
+ [cpp.subst] Reword paragraph to simplify the logical structure and avoid ambiguous references.
+
+ commit 4ce05424a8774e13b9958eb9cb9165da5b19edb0
+ Author: Richard Smith
+ Date: Tue Jun 12 16:27:40 2018 -0700
+
+ [depr.capture.this] Reorder so the order of Annex D matches the order of the main text
+
+ commit 628a32db863ac10fe0fb4c45d6975a50f5497acf
+ Author: Richard Smith
+ Date: Tue Jun 12 16:26:37 2018 -0700
+
+ [depr.capture.this] Replace "can" with "may".
+
+ This wording is describing permission, not capability, so should use "may".
+
+ commit 5274b2ee4c558d39012a34d104be0d2139115c00
+ Author: Thomas Köppe
+ Date: Fri Jun 15 14:31:14 2018 +0100
+
+ [temp.deduct] Fixes from editorial review of CWG2293:
+
+ * Use "not valid" rather than "invalid", since only "valid" has been defined.
+ * Add an "otherwise" to improve flow.
+
+ commit 0e771884acfdcb1dc693ef654f34cf717986f803
+ Author: Jonathan Wakely
+ Date: Fri Jun 8 08:23:25 2018 +0100
+
+ [time.zone.db.remote] replace "this section" with "this subclause" (#2103)
+
+ commit b9c5272c78fb312883cb548219b7fd2cb44280c7
+ Author: Thomas Köppe
+ Date: Thu Jun 7 23:24:37 2018 +0200
+
+ [cfenv.syn] Add "optional" markers for macros from the C library that are optional (as defined by C)
+
+ commit aa77121b3aa9bc566b8d2e428cd21a28493ce57e
+ Author: Alberto Barbati <2210776+iaanus@users.noreply.github.com>
+ Date: Thu Jun 7 21:39:51 2018 +0200
+
+ [dcl.attr.likelihood] Fix error in example
+
+ commit fbee1d521da91a798d81ecc09f110a0946239630
+ Author: Jens Maurer
+ Date: Thu Jun 7 21:36:42 2018 +0200
+
+ [views.general] Remove redundant introduction for span. (#2062)
+
+ commit 069a179a0d54cad4b3d00f00eae532c827786894
+ Author: Jens Maurer
+ Date: Tue Mar 27 14:41:13 2018 +0200
+
+ [cmp.syn] Rename to [compare.syn] to match the header name
+
+ commit 8a0060d0dcda8c63a2c432016bd038c75a8de9a1
+ Author: Marc Mutz
+ Date: Thu Jun 7 03:34:12 2018 +0200
+
+ [list.modifiers, forward.list.modifiers] Add missing 'to' in 'referred [to] by' (#2100)
+
+ commit 57de3af9d24037d60d996b255c1ded8ee65387d2
+ Author: Arthur O'Dwyer
+ Date: Wed May 30 00:18:13 2018 -0700
+
+ [comparisons] Fix a typo in the note for `std::less`. (#2089)
+
+ commit 61b6c21f218e3cbb9d15426975f1a26d8b72a7fe
+ Author: Richard Smith
+ Date: Thu May 10 14:40:22 2018 -0700
+
+ [class.expl.init] Fix example to account for guaranteed copy omission.
diff --git a/source/access.tex b/source/access.tex
deleted file mode 100644
index ab35bc7109..0000000000
--- a/source/access.tex
+++ /dev/null
@@ -1,983 +0,0 @@
-%!TEX root = std.tex
-\rSec0[class.access]{Member access control}%
-\indextext{access control|(}
-
-\indextext{protection|see{access control}}
-\indextext{\idxcode{private}|see{access control, \tcode{private}}}
-\indextext{\idxcode{protected}|see{access control, \tcode{protected}}}
-\indextext{\idxcode{public}|see{access control, \tcode{public}}}
-
-\pnum
-A member of a class can be
-\begin{itemize}
-\item
-\indextext{access control!\idxcode{private}}%
-private;
-that is, its name can be used only by members and friends
-of the class in which it is declared.
-\item
-\indextext{access control!\idxcode{protected}}%
-protected;
-that is, its name can be used only by members and friends
-of the class in which it is declared, by classes derived from that class, and by their
-friends (see~\ref{class.protected}).
-\item
-\indextext{access control!\idxcode{public}}%
-public;
-that is, its name can be used anywhere without access restriction.
-\end{itemize}
-
-\pnum
-A member of a class can also access all the names to which the class has access.
-A local class of a member function may access
-the same names that the member function itself may access.\footnote{Access
-permissions are thus transitive and cumulative to nested
-and local classes.}
-
-\pnum
-\indextext{access control!member name}%
-\indextext{default access control|see{access control, default}}%
-\indextext{access control!default}%
-Members of a class defined with the keyword
-\tcode{class}
-are
-\tcode{private}
-by default.
-Members of a class defined with the keywords
-\tcode{struct} or \tcode{union}
-are public by default.
-\begin{example}
-
-\begin{codeblock}
-class X {
- int a; // \tcode{X::a} is private by default
-};
-
-struct S {
- int a; // \tcode{S::a} is public by default
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-Access control is applied uniformly to all names, whether the names are
-referred to from declarations or expressions.
-\begin{note}
-Access control applies to names nominated by
-friend declarations\iref{class.friend} and
-\grammarterm{using-declaration}{s}\iref{namespace.udecl}.
-\end{note}
-In the case of overloaded function names, access control is applied to
-the function selected by overload resolution.
-\begin{note}
-Because access control applies to names, if access control is applied to a
-typedef name, only the accessibility of the typedef name itself is considered.
-The accessibility of the entity referred to by the typedef is not considered.
-For example,
-
-\begin{codeblock}
-class A {
- class B { };
-public:
- typedef B BB;
-};
-
-void f() {
- A::BB x; // OK, typedef name \tcode{A::BB} is public
- A::B y; // access error, \tcode{A::B} is private
-}
-\end{codeblock}
-\end{note}
-
-\pnum
-\begin{note}
-Access to members and base classes is controlled, not their
-visibility\iref{basic.scope.hiding}.
-Names of members are still visible, and implicit conversions to base
-classes are still considered, when those members and base classes are
-inaccessible.
-\end{note}
-The interpretation of a given construct is
-established without regard to access control.
-If the interpretation
-established makes use of inaccessible member names or base classes,
-the construct is ill-formed.
-
-\pnum
-All access controls in \ref{class.access} affect the ability to access a class member
-name from the declaration of a particular
-entity, including parts of the declaration preceding the name of the entity
-being declared and, if the entity is a class, the definitions of members of
-the class appearing outside the class's \grammarterm{member-specification}{.}
-\begin{note} This access also applies to implicit references to constructors,
-conversion functions, and destructors. \end{note}
-
-\pnum
-\begin{example}
-\begin{codeblock}
-class A {
- typedef int I; // private member
- I f();
- friend I g(I);
- static I x;
- template struct Q;
- template friend struct R;
-protected:
- struct B { };
-};
-
-A::I A::f() { return 0; }
-A::I g(A::I p = A::x);
-A::I g(A::I p) { return 0; }
-A::I A::x = 0;
-template struct A::Q { };
-template struct R { };
-
-struct D: A::B, A { };
-\end{codeblock}
-
-Here, all the uses of
-\tcode{A::I}
-are well-formed because
-\tcode{A::f},
-\tcode{A::x}, and \tcode{A::Q}
-are members of class
-\tcode{A}
-and
-\tcode{g}
-and \tcode{R} are friends of class
-\tcode{A}.
-This implies, for example, that access checking on the first use of
-\tcode{A::I}
-must be deferred until it is determined that this use of
-\tcode{A::I}
-is as the return type of a member of class
-\tcode{A}.
-Similarly, the use of \tcode{A::B} as a
-\grammarterm{base-specifier} is well-formed because \tcode{D}
-is derived from \tcode{A}, so checking of \grammarterm{base-specifier}{s}
-must be deferred until the entire \grammarterm{base-specifier-list} has been seen.
-\end{example}
-
-\pnum
-\indextext{argument!access checking and default}%
-\indextext{access control!default argument}%
-The names in a default argument\iref{dcl.fct.default} are
-bound at the point of declaration, and access is checked at that
-point rather than at any points of use of the default argument.
-Access checking for default arguments in function templates and in
-member functions of class templates is performed as described in~\ref{temp.inst}.
-
-\pnum
-The names in a default \grammarterm{template-argument}\iref{temp.param}
-have their access checked in the context in which they appear rather than at any
-points of use of the default \grammarterm{template-argument}. \begin{example}
-\begin{codeblock}
-class B { };
-template class C {
-protected:
- typedef T TT;
-};
-
-template
-class D : public U { };
-
-D >* d; // access error, \tcode{C::TT} is protected
-\end{codeblock}
-\end{example}
-
-\rSec1[class.access.spec]{Access specifiers}%
-\indextext{access specifier}
-
-\pnum
-Member declarations can be labeled by an
-\grammarterm{access-specifier}
-(\ref{class.derived}):
-
-\begin{ncsimplebnf}
-access-specifier \terminal{:} \opt{member-specification}
-\end{ncsimplebnf}
-
-An
-\grammarterm{access-specifier}
-specifies the access rules for members following it
-until the end of the class or until another
-\grammarterm{access-specifier}
-is encountered.
-\begin{example}
-
-\begin{codeblock}
-class X {
- int a; // \tcode{X::a} is private by default: \tcode{class} used
-public:
- int b; // \tcode{X::b} is public
- int c; // \tcode{X::c} is public
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-Any number of access specifiers is allowed and no particular order is required.
-\begin{example}
-
-\begin{codeblock}
-struct S {
- int a; // \tcode{S::a} is public by default: \tcode{struct} used
-protected:
- int b; // \tcode{S::b} is protected
-private:
- int c; // \tcode{S::c} is private
-public:
- int d; // \tcode{S::d} is public
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-\begin{note} The effect of access control on the order of allocation
-of data members is described in~\ref{class.mem}.\end{note}
-
-\pnum
-When a member is redeclared within its class definition,
-the access specified at its redeclaration shall
-be the same as at its initial declaration.
-\begin{example}
-
-\begin{codeblock}
-struct S {
- class A;
- enum E : int;
-private:
- class A { }; // error: cannot change access
- enum E: int { e0 }; // error: cannot change access
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-\begin{note}
-In a derived class, the lookup of a base class name will find the
-injected-class-name instead of the name of the base class in the scope
-in which it was declared. The injected-class-name might be less accessible
-than the name of the base class in the scope in which it was declared.
-\end{note}
-
-\begin{example}
-\begin{codeblock}
-class A { };
-class B : private A { };
-class C : public B {
- A* p; // error: injected-class-name \tcode{A} is inaccessible
- ::A* q; // OK
-};
-\end{codeblock}
-\end{example}
-
-\rSec1[class.access.base]{Accessibility of base classes and base class members}%
-\indextext{access control!base class}%
-\indextext{access specifier}%
-\indextext{base class!\idxcode{private}}%
-\indextext{base class!\idxcode{protected}}%
-\indextext{base class!\idxcode{public}}
-
-\pnum
-If a class is declared to be a base class\iref{class.derived} for another class using the
-\tcode{public}
-access specifier, the
-public members of the base class are accessible as
-public members of the derived class and
-protected members of the base class are accessible as
-protected members of the derived class.
-If a class is declared to be a base class for another class using the
-\tcode{protected}
-access specifier, the
-public and protected members of the base class are accessible as
-protected members of the derived class.
-If a class is declared to be a base class for another class using the
-private
-access specifier, the
-public and protected
-members of the base class are accessible as private
-members of the derived class.\footnote{As specified previously in \ref{class.access},
-private members of a base class remain inaccessible even to derived classes
-unless friend
-declarations within the base class definition are used to grant access explicitly.}
-
-\pnum
-In the absence of an
-\grammarterm{access-specifier}
-for a base class,
-\tcode{public}
-is assumed when the derived class is
-defined with the \grammarterm{class-key}
-\tcode{struct}
-and
-\tcode{private}
-is assumed when the class is
-defined with the \grammarterm{class-key}
-\tcode{class}.
-\begin{example}
-
-\begin{codeblock}
-class B { @\commentellip@ };
-class D1 : private B { @\commentellip@ };
-class D2 : public B { @\commentellip@ };
-class D3 : B { @\commentellip@ }; // \tcode{B} private by default
-struct D4 : public B { @\commentellip@ };
-struct D5 : private B { @\commentellip@ };
-struct D6 : B { @\commentellip@ }; // \tcode{B} public by default
-class D7 : protected B { @\commentellip@ };
-struct D8 : protected B { @\commentellip@ };
-\end{codeblock}
-
-Here
-\tcode{B}
-is a public base of
-\tcode{D2},
-\tcode{D4},
-and
-\tcode{D6},
-a private base of
-\tcode{D1},
-\tcode{D3},
-and
-\tcode{D5},
-and a protected base of
-\tcode{D7}
-and
-\tcode{D8}.
-\end{example}
-
-\pnum
-\begin{note}
-A member of a private base class might be inaccessible as an inherited
-member name, but accessible directly.
-Because of the rules on pointer conversions\iref{conv.ptr} and explicit casts\iref{expr.cast}, a conversion from a pointer to a derived class to a pointer
-to an inaccessible base class might be ill-formed if an implicit conversion
-is used, but well-formed if an explicit cast is used.
-For example,
-
-\begin{codeblock}
-class B {
-public:
- int mi; // non-static member
- static int si; // static member
-};
-class D : private B {
-};
-class DD : public D {
- void f();
-};
-
-void DD::f() {
- mi = 3; // error: \tcode{mi} is private in \tcode{D}
- si = 3; // error: \tcode{si} is private in \tcode{D}
- ::B b;
- b.mi = 3; // OK (\tcode{b.mi} is different from \tcode{this->mi})
- b.si = 3; // OK (\tcode{b.si} is different from \tcode{this->si})
- ::B::si = 3; // OK
- ::B* bp1 = this; // error: \tcode{B} is a private base class
- ::B* bp2 = (::B*)this; // OK with cast
- bp2->mi = 3; // OK: access through a pointer to \tcode{B}.
-}
-\end{codeblock}
-\end{note}
-
-\pnum
-A base class
-\tcode{B}
-of
-\tcode{N}
-is
-\defn{accessible}
-at
-\placeholder{R},
-if
-\begin{itemize}
-\item
-an invented public member of
-\tcode{B}
-would be a public member of
-\tcode{N}, or
-\item
-\placeholder{R}
-occurs in a member or friend of class
-\tcode{N},
-and an invented public member of
-\tcode{B}
-would be a private or protected member of
-\tcode{N}, or
-\item
-\placeholder{R}
-occurs in a member or friend of a class
-\tcode{P}
-derived from
-\tcode{N},
-and an invented public member of
-\tcode{B}
-would be a private or protected member of
-\tcode{P}, or
-\item
-there exists a class
-\tcode{S}
-such that
-\tcode{B}
-is a base class of
-\tcode{S}
-accessible at
-\placeholder{R}
-and
-\tcode{S}
-is a base class of
-\tcode{N}
-accessible at
-\placeholder{R}.
-\end{itemize}
-
-\begin{example}
-\begin{codeblock}
-class B {
-public:
- int m;
-};
-
-class S: private B {
- friend class N;
-};
-
-class N: private S {
- void f() {
- B* p = this; // OK because class \tcode{S} satisfies the fourth condition above: \tcode{B} is a base class of \tcode{N}
- // accessible in \tcode{f()} because \tcode{B} is an accessible base class of \tcode{S} and \tcode{S} is an accessible
- // base class of \tcode{N}.
- }
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-If a base class is accessible, one can implicitly convert a pointer to
-a derived class to a pointer to that base class~(\ref{conv.ptr}, \ref{conv.mem}).
-\begin{note}
-It follows that
-members and friends of a class
-\tcode{X}
-can implicitly convert an
-\tcode{X*}
-to a pointer to a private or protected immediate base class of
-\tcode{X}.
-\end{note}
-The access to a member is affected by the class in which the member is
-named.
-This naming class is the class in which the member name was looked
-up and found.
-\begin{note}
-This class can be explicit, e.g., when a
-\grammarterm{qualified-id}
-is used, or implicit, e.g., when a class member access operator\iref{expr.ref} is used (including cases where an implicit
-``\tcode{this->}''
-is
-added).
-If both a class member access operator and a
-\grammarterm{qualified-id}
-are used to name the member (as in
-\tcode{p->T::m}),
-the class naming the member is the class denoted by the
-\grammarterm{nested-name-specifier}
-of the
-\grammarterm{qualified-id}
-(that is,
-\tcode{T}).
-\end{note}
-A member
-\tcode{m}
-is accessible at the point
-\placeholder{R}
-when named in class
-\tcode{N}
-if
-\begin{itemize}
-\item
-\tcode{m}
-as a member of
-\tcode{N}
-is public, or
-\item
-\tcode{m}
-as a member of
-\tcode{N}
-is private, and
-\placeholder{R}
-occurs in a member or friend of class
-\tcode{N},
-or
-\item
-\tcode{m}
-as a member of
-\tcode{N}
-is protected, and
-\placeholder{R}
-occurs in a member or friend of class
-\tcode{N},
-or in a member of a class
-\tcode{P}
-derived from
-\tcode{N},
-where
-\tcode{m}
-as a member of
-\tcode{P}
-is public, private, or protected, or
-\item
-there exists a base class
-\tcode{B}
-of
-\tcode{N}
-that is accessible at
-\placeholder{R},
-and
-\tcode{m}
-is accessible at
-\placeholder{R}
-when named in class
-\tcode{B}.
-\begin{example}
-
-\begin{codeblock}
-class B;
-class A {
-private:
- int i;
- friend void f(B*);
-};
-class B : public A { };
-void f(B* p) {
- p->i = 1; // OK: \tcode{B*} can be implicitly converted to \tcode{A*}, and \tcode{f} has access to \tcode{i} in \tcode{A}
-}
-\end{codeblock}
-\end{example}
-\end{itemize}
-
-\pnum
-If a class member access operator, including an implicit
-``\tcode{this->}'',
-is used to access a non-static data member or non-static
-member function, the reference is ill-formed if the
-left operand (considered as a pointer in the
-``\tcode{.}''
-operator case) cannot be implicitly converted to a
-pointer to the naming class of the right operand.
-\begin{note}
-This requirement is in addition to the requirement that
-the member be accessible as named.
-\end{note}
-
-\rSec1[class.friend]{Friends}%
-\indextext{friend function!access and}%
-\indextext{access control!friend function}
-
-\pnum
-A friend of a class is a function or class that is
-given permission to use the private and protected member names from the class.
-A class specifies its friends, if any, by way of friend declarations.
-Such declarations give special access rights to the friends, but they
-do not make the nominated friends members of the befriending class.
-\begin{example}
-The following example illustrates the differences between
-members and friends:
-\indextext{friend function!member function and}%
-
-\begin{codeblock}
-class X {
- int a;
- friend void friend_set(X*, int);
-public:
- void member_set(int);
-};
-
-void friend_set(X* p, int i) { p->a = i; }
-void X::member_set(int i) { a = i; }
-
-void f() {
- X obj;
- friend_set(&obj,10);
- obj.member_set(10);
-}
-\end{codeblock}
-\end{example}
-
-\pnum
-\indextext{friend!class access and}%
-Declaring a class to be a friend implies that the names of private and
-protected members from the class granting friendship can be accessed in the
-\grammarterm{base-specifier}{s} and member declarations of the befriended
-class. \begin{example}
-
-\begin{codeblock}
-class A {
- class B { };
- friend class X;
-};
-
-struct X : A::B { // OK: \tcode{A::B} accessible to friend
- A::B mx; // OK: \tcode{A::B} accessible to member of friend
- class Y {
- A::B my; // OK: \tcode{A::B} accessible to nested member of friend
- };
-};
-\end{codeblock}
-\end{example}
-\begin{example}
-
-\begin{codeblock}
-class X {
- enum { a=100 };
- friend class Y;
-};
-
-class Y {
- int v[X::a]; // OK, \tcode{Y} is a friend of \tcode{X}
-};
-
-class Z {
- int v[X::a]; // error: \tcode{X::a} is private
-};
-\end{codeblock}
-\end{example}
-
-A class shall not be defined in a friend declaration. \begin{example}
-\begin{codeblock}
-class A {
- friend class B { }; // error: cannot define class in friend declaration
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-A friend declaration that does not declare a function
-shall have one of the following forms:
-
-\begin{ncsimplebnf}
-\terminal{friend} elaborated-type-specifier \terminal{;}\br
-\terminal{friend} simple-type-specifier \terminal{;}\br
-\terminal{friend} typename-specifier \terminal{;}
-\end{ncsimplebnf}
-
-\begin{note} A friend declaration may be the
-\grammarterm{declaration} in a \grammarterm{template-declaration}
-(\ref{temp}, \ref{temp.friend}).\end{note} If the
-type specifier in a \tcode{friend} declaration designates a (possibly
-cv-qualified) class type, that class is declared as a friend; otherwise, the
-friend declaration is ignored. \begin{example}
-
-\begin{codeblock}
-class C;
-typedef C Ct;
-
-class X1 {
- friend C; // OK: \tcode{class C} is a friend
-};
-
-class X2 {
- friend Ct; // OK: \tcode{class C} is a friend
- friend D; // error: no type-name \tcode{D} in scope
- friend class D; // OK: elaborated-type-specifier declares new class
-};
-
-template class R {
- friend T;
-};
-
-R rc; // \tcode{class C} is a friend of \tcode{R}
-R Ri; // OK: \tcode{"friend int;"} is ignored
-\end{codeblock}
-\end{example}
-
-\pnum
-\indextext{friend function!linkage of}%
-A function first declared in a friend declaration
-has the linkage of the namespace of which it is a member\iref{basic.link}.
-Otherwise, the function retains its previous linkage\iref{dcl.stc}.
-
-\pnum
-\indextext{declaration!overloaded name and \tcode{friend}}%
-When a friend
-declaration refers to an overloaded name or operator, only the function specified
-by the parameter types becomes a friend.
-A member function of a class
-\tcode{X}
-can be a friend of
-a class
-\tcode{Y}.
-\indextext{member function!friend}%
-\begin{example}
-
-\begin{codeblock}
-class Y {
- friend char* X::foo(int);
- friend X::X(char); // constructors can be friends
- friend X::~X(); // destructors can be friends
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-\indextext{friend function!inline}%
-A function can be defined in a friend declaration of a class if and only if the
-class is a non-local class\iref{class.local}, the function name is unqualified,
-and the function has namespace scope.
-\begin{example}
-
-\begin{codeblock}
-class M {
- friend void f() { } // definition of global \tcode{f}, a friend of \tcode{M},
- // not the definition of a member function
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-Such a function is implicitly an inline function\iref{dcl.inline}.
-A friend
-function defined in a class is in the (lexical) scope of the class in which it is defined.
-A friend function defined outside the class is not\iref{basic.lookup.unqual}.
-
-\pnum
-No
-\grammarterm{storage-class-specifier}
-shall appear in the
-\grammarterm{decl-specifier-seq}
-of a friend declaration.
-
-\pnum
-\indextext{friend!access specifier and}%
-A name nominated by a friend declaration shall be accessible in the scope of the
-class containing the friend declaration.
-The meaning of the friend declaration is the same whether the friend declaration
-appears in the private, protected, or public\iref{class.mem}
-portion of the class
-\grammarterm{member-specification}.
-
-\pnum
-\indextext{friend!inheritance and}%
-Friendship is neither inherited nor transitive.
-\begin{example}
-
-\begin{codeblock}
-class A {
- friend class B;
- int a;
-};
-
-class B {
- friend class C;
-};
-
-class C {
- void f(A* p) {
- p->a++; // error: \tcode{C} is not a friend of \tcode{A} despite being a friend of a friend
- }
-};
-
-class D : public B {
- void f(A* p) {
- p->a++; // error: \tcode{D} is not a friend of \tcode{A} despite being derived from a friend
- }
-};
-\end{codeblock}
-\end{example}
-
-\pnum
-\indextext{local class!friend}%
-\indextext{friend!local class and}%
-If a friend declaration appears in a local class\iref{class.local} and the
-name specified is an unqualified name, a prior declaration is looked
-up without considering scopes that are outside the innermost enclosing
-non-class scope.
-For a friend function declaration, if there is no
-prior declaration, the program is ill-formed.
-For a friend class
-declaration, if there is no prior declaration, the class that is
-specified belongs to the innermost enclosing non-class scope, but if it is
-subsequently referenced, its name is not found by name lookup
-until a matching declaration is provided in the innermost enclosing
-non-class scope.
-\begin{example}
-
-\begin{codeblock}
-class X;
-void a();
-void f() {
- class Y;
- extern void b();
- class A {
- friend class X; // OK, but \tcode{X} is a local class, not \tcode{::X}
- friend class Y; // OK
- friend class Z; // OK, introduces local class \tcode{Z}
- friend void a(); // error, \tcode{::a} is not considered
- friend void b(); // OK
- friend void c(); // error
- };
- X* px; // OK, but \tcode{::X} is found
- Z* pz; // error, no \tcode{Z} is found
-}
-\end{codeblock}
-\end{example}
-
-\rSec1[class.protected]{Protected member access}
-\indextext{access control!\idxcode{protected}}%
-
-\pnum
-An additional access check beyond those described earlier in \ref{class.access}
-is applied when a non-static data member or non-static member function is a
-protected member of its naming class\iref{class.access.base}.\footnote{This
-additional check does not apply to other members,
-e.g., static data members or enumerator member constants.}
-As described earlier, access to a protected member is granted because the
-reference occurs in a friend or member of some class \tcode{C}. If the access is
-to form a pointer to member\iref{expr.unary.op}, the
-\grammarterm{nested-name-specifier} shall denote \tcode{C} or a class derived from
-\tcode{C}. All other accesses involve a (possibly implicit) object
-expression\iref{expr.ref}. In this case, the class of the object expression shall be
-\tcode{C} or a class derived from \tcode{C}.
-\begin{example}
-
-\begin{codeblock}
-class B {
-protected:
- int i;
- static int j;
-};
-
-class D1 : public B {
-};
-
-class D2 : public B {
- friend void fr(B*,D1*,D2*);
- void mem(B*,D1*);
-};
-
-void fr(B* pb, D1* p1, D2* p2) {
- pb->i = 1; // ill-formed
- p1->i = 2; // ill-formed
- p2->i = 3; // OK (access through a \tcode{D2})
- p2->B::i = 4; // OK (access through a \tcode{D2}, even though naming class is \tcode{B})
- int B::* pmi_B = &B::i; // ill-formed
- int B::* pmi_B2 = &D2::i; // OK (type of \tcode{\&D2::i} is \tcode{int B::*})
- B::j = 5; // ill-formed (not a friend of naming class \tcode{B})
- D2::j = 6; // OK (because refers to static member)
-}
-
-void D2::mem(B* pb, D1* p1) {
- pb->i = 1; // ill-formed
- p1->i = 2; // ill-formed
- i = 3; // OK (access through \tcode{this})
- B::i = 4; // OK (access through \tcode{this}, qualification ignored)
- int B::* pmi_B = &B::i; // ill-formed
- int B::* pmi_B2 = &D2::i; // OK
- j = 5; // OK (because \tcode{j} refers to static member)
- B::j = 6; // OK (because \tcode{B::j} refers to static member)
-}
-
-void g(B* pb, D1* p1, D2* p2) {
- pb->i = 1; // ill-formed
- p1->i = 2; // ill-formed
- p2->i = 3; // ill-formed
-}
-\end{codeblock}
-\end{example}
-
-\rSec1[class.access.virt]{Access to virtual functions}%
-\indextext{access control!virtual function}
-
-\pnum
-The access rules\iref{class.access} for a virtual function are determined by its declaration
-and are not affected by the rules for a function that later overrides it.
-\begin{example}
-
-\begin{codeblock}
-class B {
-public:
- virtual int f();
-};
-
-class D : public B {
-private:
- int f();
-};
-
-void f() {
- D d;
- B* pb = &d;
- D* pd = &d;
-
- pb->f(); // OK: \tcode{B::f()} is public, \tcode{D::f()} is invoked
- pd->f(); // error: \tcode{D::f()} is private
-}
-\end{codeblock}
-\end{example}
-
-\pnum
-Access is checked at the call point using the type of the expression used
-to denote the object for which the member function is called
-(\tcode{B*}
-in the example above).
-The access of the member function in the class in which it was defined
-(\tcode{D}
-in the example above) is in general not known.
-
-\rSec1[class.paths]{Multiple access}%
-\indextext{access control!multiple access}
-
-\pnum
-If a name can be reached by several paths through a multiple inheritance
-graph, the access is that of the path that gives most access.
-\begin{example}
-
-\begin{codeblock}
-class W { public: void f(); };
-class A : private virtual W { };
-class B : public virtual W { };
-class C : public A, public B {
- void f() { W::f(); } // OK
-};
-\end{codeblock}
-
-Since
-\tcode{W::f()}
-is available to
-\tcode{C::f()}
-along the public path through
-\tcode{B},
-access is allowed.
-\end{example}
-
-\rSec1[class.access.nest]{Nested classes}%
-\indextext{access control!nested class}%
-\indextext{member function!nested class}
-
-\pnum
-A nested class is a member and as such has the same access rights as any other member.
-The members of an enclosing class have no special access to members of a nested
-class; the usual access rules\iref{class.access} shall be obeyed.
-\begin{example}
-\begin{codeblock}
-class E {
- int x;
- class B { };
-
- class I {
- B b; // OK: \tcode{E::I} can access \tcode{E::B}
- int y;
- void f(E* p, int i) {
- p->x = i; // OK: \tcode{E::I} can access \tcode{E::x}
- }
- };
-
- int g(I* p) {
- return p->y; // error: \tcode{I::y} is private
- }
-};
-\end{codeblock}
-\end{example}%
-\indextext{access control|)}
diff --git a/source/algorithms.tex b/source/algorithms.tex
index a9f0c66d93..4bf758ba93 100644
--- a/source/algorithms.tex
+++ b/source/algorithms.tex
@@ -19,2000 +19,2832 @@
\ref{alg.nonmodifying} & Non-modifying sequence operations & \\
\ref{alg.modifying.operations} & Mutating sequence operations & \tcode{} \\
\ref{alg.sorting} & Sorting and related operations & \\ \hline
+\ref{numeric.ops} & Generalized numeric operations & \tcode{} \\ \rowsep
\ref{alg.c.library} & C library algorithms & \tcode{} \\ \hline
\end{libsumtab}
-\rSec1[algorithm.syn]{Header \tcode{} synopsis}
-\indexhdr{algorithm}%
+\rSec1[algorithms.requirements]{Algorithms requirements}
+\pnum
+All of the algorithms are separated from the particular implementations of data structures and are
+parameterized by iterator types.
+Because of this, they can work with program-defined data structures, as long
+as these data structures have iterator types satisfying the assumptions on the algorithms.
-\begin{codeblock}
-#include
+\pnum
+For purposes of determining the existence of data races, algorithms shall
+not modify objects referenced through an iterator argument unless the
+specification requires such modification.
-namespace std {
- // \ref{alg.nonmodifying}, non-modifying sequence operations
- // \ref{alg.all_of}, all of
- template
- constexpr bool all_of(InputIterator first, InputIterator last, Predicate pred);
- template
- bool all_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last, Predicate pred);
+\pnum
+Throughout this Clause, the names of template parameters
+are used to express type requirements.
+\begin{itemize}
+\item
+If an algorithm's template parameter is named
+\tcode{InputIterator},
+\tcode{InputIterator1},
+or
+\tcode{Input\-Iterator2},
+the template argument shall satisfy the
+\oldconcept{InputIterator} requirements\iref{input.iterators}.
+\item
+If an algorithm's template parameter is named
+\tcode{OutputIterator},
+\tcode{OutputIterator1},
+or
+\tcode{Output\-Iterator2},
+the template argument shall satisfy the
+\oldconcept{OutputIterator} requirements\iref{output.iterators}.
+\item
+If an algorithm's template parameter is named
+\tcode{ForwardIterator},
+\tcode{ForwardIterator1},
+or
+\tcode{Forward\-Iterator2},
+the template argument shall satisfy the
+\oldconcept{ForwardIterator} requirements\iref{forward.iterators}.
+\item
+If an algorithm's template parameter is named
+\tcode{BidirectionalIterator},
+\tcode{Bidirectional\-Iterator1},
+or
+\tcode{BidirectionalIterator2},
+the template argument shall satisfy the
+\oldconcept{BidirectionalIterator} requirements\iref{bidirectional.iterators}.
+\item
+If an algorithm's template parameter is named
+\tcode{RandomAccessIterator},
+\tcode{Random\-AccessIterator1},
+or
+\tcode{RandomAccessIterator2},
+the template argument shall satisfy the
+\oldconcept{RandomAccessIterator} requirements\iref{random.access.iterators}.
+\end{itemize}
- // \ref{alg.any_of}, any of
- template
- constexpr bool any_of(InputIterator first, InputIterator last, Predicate pred);
- template
- bool any_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last, Predicate pred);
+\pnum
+If an algorithm's
+\effects
+element specifies that a value pointed to by any iterator passed
+as an argument is modified, then that algorithm has an additional
+type requirement:
+The type of that argument shall satisfy the requirements
+of a mutable iterator\iref{iterator.requirements}.
+\begin{note}
+This requirement does not affect arguments that are named
+\tcode{OutputIterator},
+\tcode{OutputIterator1},
+or
+\tcode{OutputIterator2},
+because output iterators must always be mutable.
+\end{note}
- // \ref{alg.none_of}, none of
- template
- constexpr bool none_of(InputIterator first, InputIterator last, Predicate pred);
- template
- bool none_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last, Predicate pred);
+\pnum
+Both in-place and copying versions are provided for certain
+algorithms.\footnote{The decision whether to include a copying version was
+usually based on complexity considerations. When the cost of doing the operation
+dominates the cost of copy, the copying version is not included. For example,
+\tcode{sort_copy} is not included because the cost of sorting is much more
+significant, and users might as well do \tcode{copy} followed by \tcode{sort}.}
+When such a version is provided for \textit{algorithm} it is called
+\textit{algorithm\tcode{_copy}}. Algorithms that take predicates end with the
+suffix \tcode{_if} (which follows the suffix \tcode{_copy}).
- // \ref{alg.foreach}, for each
- template
- constexpr Function for_each(InputIterator first, InputIterator last, Function f);
- template
- void for_each(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last, Function f);
- template
- constexpr InputIterator for_each_n(InputIterator first, Size n, Function f);
- template
- ForwardIterator for_each_n(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, Size n, Function f);
+\pnum
+The
+\tcode{Predicate}
+parameter is used whenever an algorithm expects a function object\iref{function.objects}
+that, when applied to the result
+of dereferencing the corresponding iterator, returns a value testable as
+\tcode{true}.
+In other words, if an algorithm
+takes
+\tcode{Predicate pred}
+as its argument and \tcode{first}
+as its iterator argument, it should work correctly in the
+construct
+\tcode{pred(*first)} contextually converted to \tcode{bool}\iref{conv}.
+The function object
+\tcode{pred}
+shall not apply any non-constant
+function through the dereferenced iterator.
- // \ref{alg.find}, find
- template
- constexpr InputIterator find(InputIterator first, InputIterator last,
- const T& value);
- template
- ForwardIterator find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last,
- const T& value);
- template
- constexpr InputIterator find_if(InputIterator first, InputIterator last,
- Predicate pred);
- template
- ForwardIterator find_if(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last,
- Predicate pred);
- template
- constexpr InputIterator find_if_not(InputIterator first, InputIterator last,
- Predicate pred);
- template
- ForwardIterator find_if_not(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last,
- Predicate pred);
+\pnum
+The
+\tcode{BinaryPredicate}
+parameter is used whenever an algorithm expects a function object that when applied to
+the result of dereferencing two corresponding iterators or to dereferencing an
+iterator and type
+\tcode{T}
+when
+\tcode{T}
+is part of the signature returns a value testable as
+\tcode{true}.
+In other words, if an algorithm takes
+\tcode{BinaryPredicate binary_pred}
+as its argument and \tcode{first1} and \tcode{first2} as
+its iterator arguments, it should work correctly in
+the construct
+\tcode{binary_pred(*first1, *first2)} contextually converted to \tcode{bool}\iref{conv}.
+\tcode{BinaryPredicate}
+always takes the first
+iterator's \tcode{value_type}
+as its first argument, that is, in those cases when
+\tcode{T value}
+is part of the signature, it should work
+correctly in the
+construct \tcode{binary_pred(*first1, value)} contextually converted to \tcode{bool}\iref{conv}.
+\tcode{binary_pred} shall not
+apply any non-constant function through the dereferenced iterators.
- // \ref{alg.find.end}, find end
- template
- constexpr ForwardIterator1
- find_end(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
- template
- constexpr ForwardIterator1
- find_end(ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2,
- BinaryPredicate pred);
- template
- ForwardIterator1
- find_end(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
- template
- ForwardIterator1
- find_end(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2,
- BinaryPredicate pred);
+\pnum
+The parameters
+\tcode{UnaryOperation},
+\tcode{BinaryOperation},
+\tcode{BinaryOperation1},
+and \tcode{BinaryOperation2}
+are used
+whenever an algorithm expects a function object\iref{function.objects}.
- // \ref{alg.find.first.of}, find first
- template
- constexpr InputIterator
- find_first_of(InputIterator first1, InputIterator last1,
- ForwardIterator first2, ForwardIterator last2);
- template
- constexpr InputIterator
- find_first_of(InputIterator first1, InputIterator last1,
- ForwardIterator first2, ForwardIterator last2,
- BinaryPredicate pred);
- template
- ForwardIterator1
- find_first_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2);
- template
- ForwardIterator1
- find_first_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator1 first1, ForwardIterator1 last1,
- ForwardIterator2 first2, ForwardIterator2 last2,
- BinaryPredicate pred);
+\pnum
+\begin{note}
+Unless otherwise specified, algorithms that take function objects as arguments
+are permitted to copy those function objects freely. Programmers for whom object
+identity is important should consider using a wrapper class that points to a
+noncopied implementation object such as \tcode{reference_wrapper}\iref{refwrap}, or some equivalent solution.
+\end{note}
- // \ref{alg.adjacent.find}, adjacent find
- template
- constexpr ForwardIterator
- adjacent_find(ForwardIterator first, ForwardIterator last);
- template
- constexpr ForwardIterator
- adjacent_find(ForwardIterator first, ForwardIterator last,
- BinaryPredicate pred);
- template
- ForwardIterator
- adjacent_find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last);
- template
- ForwardIterator
- adjacent_find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
- ForwardIterator first, ForwardIterator last,
- BinaryPredicate pred);
+\pnum
+When the description of an algorithm gives an expression such as
+\tcode{*first == value}
+for a condition, the expression shall evaluate to
+either \tcode{true} or \tcode{false} in boolean contexts.
- // \ref{alg.count}, count
- template
- constexpr typename iterator_traits::difference_type
- count(InputIterator first, InputIterator last, const T& value);
+\pnum
+In the description of the algorithms operators
+\tcode{+}
+and
+\tcode{-}
+are used for some of the iterator categories for which
+they do not have to be defined.
+In these cases the semantics of
+\tcode{a+n}
+is the same as that of
+
+\begin{codeblock}
+X tmp = a;
+advance(tmp, n);
+return tmp;
+\end{codeblock}
+
+and that of
+\tcode{b-a}
+is the same as of
+
+\begin{codeblock}
+return distance(a, b);
+\end{codeblock}
+
+\rSec1[algorithms.parallel]{Parallel algorithms}
+
+\pnum
+This subclause describes components that \Cpp{} programs may use to perform
+operations on containers and other sequences in parallel.
+
+\rSec2[algorithms.parallel.defns]{Terms and definitions}
+\pnum
+A \defn{parallel algorithm} is a function template listed in this document with
+a template parameter named \tcode{ExecutionPolicy}.
+
+\pnum
+Parallel algorithms access objects indirectly accessible via their arguments by
+invoking the following functions:
+
+\begin{itemize}
+\item
+All operations of the categories of the iterators that the algorithm is
+instantiated with.
+
+\item
+Operations on those sequence elements that are required by its specification.
+
+\item
+User-provided function objects to be applied during the execution of the
+algorithm, if required by the specification.
+
+\item
+Operations on those function objects required by the specification.
+\begin{note} See~\ref{algorithms.requirements}.\end{note}
+\end{itemize}
+
+These functions are herein called \defn{element access functions}.
+\begin{example}
+The \tcode{sort} function may invoke the following element access functions:
+
+\begin{itemize}
+\item
+Operations of the random-access iterator of the actual template argument
+(as per \ref{random.access.iterators}),
+as implied by the name of the template parameter \tcode{RandomAccessIterator}.
+
+\item
+The \tcode{swap} function on the elements of the sequence (as per the
+preconditions specified in \ref{sort}).
+
+\item
+The user-provided \tcode{Compare} function object.
+\end{itemize}
+\end{example}
+
+\rSec2[algorithms.parallel.user]{Requirements on user-provided function objects}
+
+\pnum
+Unless otherwise specified, function objects passed into parallel algorithms as
+objects of type \tcode{Predicate}, \tcode{BinaryPredicate}, \tcode{Compare},
+\tcode{UnaryOperation}, \tcode{BinaryOperation}, \tcode{BinaryOperation1},
+\tcode{BinaryOperation2}, and the operators used by the analogous overloads to
+these parallel algorithms that could be formed by the invocation with the
+specified default predicate or operation (where applicable) shall not directly
+or indirectly modify objects via their arguments, nor shall they rely on the
+identity of the provided objects.
+
+\rSec2[algorithms.parallel.exec]{Effect of execution policies on algorithm execution}
+
+\pnum
+Parallel algorithms have template parameters
+named \tcode{ExecutionPolicy}\iref{execpol}
+which describe the manner in which the execution of these algorithms may be
+parallelized and the manner in which they apply the element access functions.
+
+\pnum
+If an object is modified by an element access function,
+the algorithm will perform no other unsynchronized accesses to that object.
+The modifying element access functions are those
+which are specified as modifying the object.
+\begin{note}
+For example,
+\tcode{swap()}, \tcode{++}, \tcode{--}, \tcode{@=}, and assignments
+modify the object.
+For the assignment and \tcode{@=} operators,
+only the left argument is modified.
+\end{note}
+
+\pnum
+Unless otherwise stated, implementations may make arbitrary copies of elements
+(with type \tcode{T}) from sequences where \tcode{is_trivially_copy_constructible_v}
+and \tcode{is_trivially_destructible_v} are \tcode{true}.
+\begin{note}
+This implies that user-supplied function objects should not rely on object
+identity of arguments for such input sequences. Users for whom the object
+identity of the arguments to these function objects is important should
+consider using a wrapping iterator that returns a non-copied implementation
+object such as \tcode{reference_wrapper}\iref{refwrap} or some equivalent
+solution.
+\end{note}
+
+\pnum
+The invocations of element access functions in parallel algorithms invoked with
+an execution policy object of type \tcode{execution::sequenced_policy} all occur
+in the calling thread of execution.
+\begin{note}
+The invocations are not interleaved; see~\ref{intro.execution}.
+\end{note}
+
+\pnum
+The invocations of element access functions in parallel algorithms invoked with
+an execution policy object of type \tcode{execution::parallel_policy} are
+permitted to execute in either the invoking thread of execution or in a
+thread of execution implicitly
+created by the library to support parallel algorithm execution.
+If the threads of execution created by \tcode{thread}\iref{thread.thread.class} provide concurrent
+forward progress guarantees\iref{intro.progress}, then a thread of execution
+implicitly created by the library will provide parallel forward progress guarantees;
+otherwise, the provided forward progress guarantee is
+\impldef{forward progress guarantees for implicit threads of parallel algorithms (if not defined for \tcode{thread})}.
+Any such
+invocations executing in the same thread of execution are indeterminately sequenced with
+respect to each other.
+\begin{note}
+It is the caller's responsibility to ensure that the
+invocation does not introduce data races or deadlocks.
+\end{note}
+\begin{example}
+\begin{codeblock}
+int a[] = {0,1};
+std::vector v;
+std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int i) {
+ v.push_back(i*2+1); // incorrect: data race
+});
+\end{codeblock}
+The program above has a data race because of the unsynchronized access to the
+container \tcode{v}.
+\end{example}
+\begin{example}
+\begin{codeblock}
+std::atomic x{0};
+int a[] = {1,2};
+std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
+ x.fetch_add(1, std::memory_order::relaxed);
+ // spin wait for another iteration to change the value of \tcode{x}
+ while (x.load(std::memory_order::relaxed) == 1) { } // incorrect: assumes execution order
+});
+\end{codeblock}
+The above example depends on the order of execution of the iterations, and
+will not terminate if both iterations are executed sequentially on the same
+thread of execution.
+\end{example}
+\begin{example}
+\begin{codeblock}
+int x = 0;
+std::mutex m;
+int a[] = {1,2};
+std::for_each(std::execution::par, std::begin(a), std::end(a), [&](int) {
+ std::lock_guard guard(m);
+ ++x;
+});
+\end{codeblock}
+The above example synchronizes access to object \tcode{x} ensuring that it is
+incremented correctly.
+\end{example}
+
+\pnum
+The invocations of element access functions in parallel algorithms invoked with
+an execution policy of type \tcode{execution::parallel_unsequenced_policy} are
+permitted to execute in an unordered fashion in unspecified threads of execution, and
+unsequenced with respect to one another within each thread of execution.
+These threads of execution are either the invoking thread of execution or threads of
+execution implicitly created by the library; the latter will provide weakly parallel
+forward progress guarantees.
+\begin{note}
+This means that multiple function object invocations may be interleaved on a
+single thread of execution, which overrides the usual guarantee from \ref{intro.execution}
+that function executions do not interleave with one another.
+\end{note}
+Since \tcode{execution::parallel_unsequenced_policy} allows the execution of element
+access functions to be interleaved on a single thread of execution, blocking synchronization,
+including the use of mutexes, risks deadlock. Thus, the synchronization with
+\tcode{execution::parallel_unsequenced_policy} is restricted as
+follows:
+A standard library function is \defn{vectorization-unsafe} if it is specified
+to synchronize with another function invocation, or another function invocation
+is specified to synchronize with it, and if it is not a memory allocation or
+deallocation function. Vectorization-unsafe standard library functions may not
+be invoked by user code called from \tcode{execution::parallel_unsequenced_policy}
+algorithms.
+\begin{note}
+Implementations must ensure that internal synchronization inside standard
+library functions does not prevent forward progress when those functions are
+executed by threads of execution with weakly parallel forward progress guarantees.
+\end{note}
+\begin{example}
+\begin{codeblock}
+int x = 0;
+std::mutex m;
+int a[] = {1,2};
+std::for_each(std::execution::par_unseq, std::begin(a), std::end(a), [&](int) {
+ std::lock_guard guard(m); // incorrect: \tcode{lock_guard} constructor calls \tcode{m.lock()}
+ ++x;
+});
+\end{codeblock}
+The above program may result in two consecutive calls to \tcode{m.lock()} on
+the same thread of execution (which may deadlock), because the applications of the function
+object are not guaranteed to run on different threads of execution.
+\end{example}
+\begin{note}
+The semantics of the \tcode{execution::parallel_policy} or the
+\tcode{execution::parallel_unsequenced_policy} invocation allow the implementation to
+fall back to sequential execution if the system cannot parallelize an algorithm
+invocation due to lack of resources.
+\end{note}
+
+\pnum
+If an invocation of a parallel algorithm uses threads of execution implicitly
+created by the library, then the invoking thread of execution will either
+
+\begin{itemize}
+\item temporarily block with forward progress guarantee delegation\iref{intro.progress}
+ on the completion of these library-managed threads of execution, or
+\item eventually execute an element access function;
+\end{itemize}
+
+the thread of execution will continue to do so until the algorithm is finished.
+\begin{note}
+In blocking with forward progress guarantee delegation in this context,
+a thread of execution created by the library is considered to have
+finished execution as soon as it has finished the execution of the
+particular element access function that the invoking thread of execution
+logically depends on.
+\end{note}
+
+\pnum
+The semantics of parallel algorithms invoked with an execution policy object of
+\impldef{additional execution policies supported by parallel algorithms} type are
+\impldef{semantics of parallel algorithms invoked with
+imple\-men\-tation-defined execution policies}.
+
+\rSec2[algorithms.parallel.exceptions]{Parallel algorithm exceptions}
+
+\pnum
+During the execution of a parallel algorithm, if temporary memory resources are
+required for parallelization and none are available, the algorithm throws a
+\tcode{bad_alloc} exception.
+
+\pnum
+During the execution of a parallel algorithm, if the invocation of an element
+access function exits via an uncaught exception,
+the behavior is determined by the \tcode{ExecutionPolicy}.
+
+\rSec2[algorithms.parallel.overloads]{\tcode{ExecutionPolicy} algorithm overloads}
+
+\pnum
+Parallel algorithms are algorithm overloads. Each parallel algorithm overload
+has an additional template type parameter named \tcode{ExecutionPolicy}, which
+is the first template parameter.
+Additionally, each parallel algorithm overload has an additional function
+parameter of type \tcode{ExecutionPolicy\&\&}, which is the first
+function parameter.
+\begin{note} Not all algorithms have parallel algorithm overloads.\end{note}
+
+\pnum
+Unless otherwise specified, the semantics of \tcode{ExecutionPolicy} algorithm
+overloads are identical to their overloads without.
+
+\pnum
+Unless otherwise specified, the complexity requirements of \tcode{ExecutionPolicy}
+algorithm overloads are relaxed from the complexity requirements of the overloads
+without as follows:
+when the guarantee says ``at most \placeholder{expr}'' or ``exactly \placeholder{expr}''
+and does not specify the number of assignments or swaps, and \placeholder{expr}
+is not already expressed with \bigoh{} notation, the complexity of the algorithm
+shall be \bigoh{\placeholder{expr}}.
+
+\pnum
+Parallel algorithms shall not participate in overload resolution unless
+\tcode{is_execution_policy_v>} is \tcode{true}.
+
+\rSec1[algorithm.syn]{Header \tcode{} synopsis}
+\indexhdr{algorithm}%
+
+\begin{codeblock}
+#include
+
+namespace std {
+ // \ref{alg.nonmodifying}, non-modifying sequence operations
+ // \ref{alg.all_of}, all of
+ template
+ constexpr bool all_of(InputIterator first, InputIterator last, Predicate pred);
+ template
+ bool all_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, Predicate pred);
+
+ // \ref{alg.any_of}, any of
+ template
+ constexpr bool any_of(InputIterator first, InputIterator last, Predicate pred);
+ template
+ bool any_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, Predicate pred);
+
+ // \ref{alg.none_of}, none of
+ template
+ constexpr bool none_of(InputIterator first, InputIterator last, Predicate pred);
+ template
+ bool none_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, Predicate pred);
+
+ // \ref{alg.foreach}, for each
+ template
+ constexpr Function for_each(InputIterator first, InputIterator last, Function f);
+ template
+ void for_each(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, Function f);
+ template
+ constexpr InputIterator for_each_n(InputIterator first, Size n, Function f);
+ template
+ ForwardIterator for_each_n(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, Size n, Function f);
+
+ // \ref{alg.find}, find
+ template
+ constexpr InputIterator find(InputIterator first, InputIterator last,
+ const T& value);
+ template
+ ForwardIterator find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last,
+ const T& value);
+ template
+ constexpr InputIterator find_if(InputIterator first, InputIterator last,
+ Predicate pred);
+ template
+ ForwardIterator find_if(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last,
+ Predicate pred);
+ template
+ constexpr InputIterator find_if_not(InputIterator first, InputIterator last,
+ Predicate pred);
+ template
+ ForwardIterator find_if_not(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last,
+ Predicate pred);
+
+ // \ref{alg.find.end}, find end
+ template
+ constexpr ForwardIterator1
+ find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2);
+ template
+ constexpr ForwardIterator1
+ find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2,
+ BinaryPredicate pred);
+ template
+ ForwardIterator1
+ find_end(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2);
+ template
+ ForwardIterator1
+ find_end(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2,
+ BinaryPredicate pred);
+
+ // \ref{alg.find.first.of}, find first
+ template
+ constexpr InputIterator
+ find_first_of(InputIterator first1, InputIterator last1,
+ ForwardIterator first2, ForwardIterator last2);
+ template
+ constexpr InputIterator
+ find_first_of(InputIterator first1, InputIterator last1,
+ ForwardIterator first2, ForwardIterator last2,
+ BinaryPredicate pred);
+ template
+ ForwardIterator1
+ find_first_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2);
+ template
+ ForwardIterator1
+ find_first_of(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2, ForwardIterator2 last2,
+ BinaryPredicate pred);
+
+ // \ref{alg.adjacent.find}, adjacent find
+ template
+ constexpr ForwardIterator
+ adjacent_find(ForwardIterator first, ForwardIterator last);
+ template
+ constexpr ForwardIterator
+ adjacent_find(ForwardIterator first, ForwardIterator last,
+ BinaryPredicate pred);
+ template
+ ForwardIterator
+ adjacent_find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last);
+ template
+ ForwardIterator
+ adjacent_find(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last,
+ BinaryPredicate pred);
+
+ // \ref{alg.count}, count
+ template
+ constexpr typename iterator_traits::difference_type
+ count(InputIterator first, InputIterator last, const T& value);
+ template
+ typename iterator_traits::difference_type
+ count(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, const T& value);
+ template
+ constexpr typename iterator_traits::difference_type
+ count_if(InputIterator first, InputIterator last, Predicate pred);
+ template
+ typename iterator_traits::difference_type
+ count_if(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator first, ForwardIterator last, Predicate pred);
+
+ // \ref{mismatch}, mismatch
+ template
+ constexpr pair
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2);
+ template
+ constexpr pair
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, BinaryPredicate pred);
+ template
+ constexpr pair
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2);
+ template
+ constexpr pair
+ mismatch(InputIterator1 first1, InputIterator1 last1,
+ InputIterator2 first2, InputIterator2 last2,
+ BinaryPredicate pred);
+ template
+ pair
+ mismatch(ExecutionPolicy&& exec, // see \ref{algorithms.parallel.overloads}
+ ForwardIterator1 first1, ForwardIterator1 last1,
+ ForwardIterator2 first2);
+ template