diff --git a/.gitignore b/.gitignore
index bfe502c1da..bcaa1569dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,4 @@ std-gram.ext
.tags_sorted_by_file
tools/sections
*.synctex.gz
+*.synctex*
diff --git a/papers/n4810.pdf b/papers/n4810.pdf
new file mode 100644
index 0000000000..00eb319796
Binary files /dev/null and b/papers/n4810.pdf differ
diff --git a/papers/n4811.html b/papers/n4811.html
new file mode 100644
index 0000000000..bd7f20b7b7
--- /dev/null
+++ b/papers/n4811.html
@@ -0,0 +1,808 @@
+
N4811
+N4811 Editors' Report -- Programming Languages -- C++
+
+2019-03-15
+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 Marshall Clow
+for supplying the LaTeX sources for
+
+
+- P1458R1 (LWG motion 7, 42 pages of wording changes)
+- P1459R1 (LWG motion 8, 15 pages of wording changes)
+- P1463R1 (LWG motion 10, 119 pages of wording changes) and
+- P1464R1 (LWG motion 11, 60 pages of wording changes)
+
+
+and to Gor Nishanov
+for supplying a pull request for
+P0912R5 (CWG motion 15, 22 pages of wording changes).
+
+Thanks to all those who have submitted editorial
+issues
+and to those who have provided pull requests with fixes.
+
+New papers
+
+
+- N4810 is the current working draft for C++20. It replaces N4800.
+- N4811 is this Editors' Report.
+
+
+Motions incorporated into working draft
+
+Core working group motions
+
+CWG motion 1: Core issue resolutions for 14 issues in "ready" status applied, 1 not applied:
+
+
+- 2256 Lifetime of trivially-destructible objects
+- 2267 Copy-initialization of temporary in reference direct-initialization
+- 2278 Copy elision in constant expressions reconsidered
+- 2303 Partial ordering and recursive variadic inheritance
+- 2309 Restrictions on nested statements within constexpr functions
+- 2310 Type completeness and derived-to-base pointer conversions see below
+- 2317 Self-referential default member initializers
+- 2318 Nondeduced contexts in deduction from a braced-init-list
+- 2330 Missing references to variable templates
+- 2331 Redundancy in description of class scope not applied, see below
+- 2332 template-name as simple-type-name vs injected-class-name see below
+- 2336 Destructor characteristics vs potentially-constructed subobjects
+- 2352 Similar types and reference binding
+- 2358 Explicit capture of value
+- 2360
[[maybe_unused]]
and structured bindings
+
+
+CWG motion 2: Core issue resolutions for 22 issues in "tentatively ready" status applied, resolving 24 issues:
+
+
+- 581 Can a templated constructor be explicitly instantiated or specialized?
+- 1937 Incomplete specification of function pointer from lambda
+- 1938 Should hosted/freestanding be implementation-defined?
+- 2020 Inadequate description of odr-use of implicitly-invoked functions see below
+- 2051 Simplifying alias rules
+- 2083 Incorrect cases of odr-use
+- 2103 Lvalue-to-rvalue conversion is irrelevant in odr-use of a reference resolved by 2083
+- 2170 Unclear definition of odr-use for arrays resolved by 2083
+- 2257 Lifetime extension of references vs exceptions
+- 2266 Has dependent type vs is type-dependent
+- 2289 Uniqueness of structured binding names
+- 2353 Potential results of a member access expression for a static data member
+- 2354 Extended alignment and object representation
+- 2365 Confusing specification for
dynamic_cast
+- 2368 Differences in relational and three-way constant comparisons
+- 2372 Incorrect matching rules for block-scope extern declarations
+- 2379 Missing prohibition against
constexpr
in friend declaration
+- 2380 capture-default makes too many references odr-usable
+- 2381 Composite pointer type of pointers to plain and
noexcept
member functions
+- 2384 Conversion function templates and qualification conversions
+- 2385 Lookup for conversion-function-ids
+- 2386
tuple_size
requirements for structured binding
+- 2387 Linkage of const-qualified variable template
+- 2394 Const-default-constructible for members
+
+
+CWG motion 3: P1286R2 "Contra CWG DR1778" (DR)
+
+
+- Alters resolution of 1778 exception-specification in explicitly-defaulted functions
+
+
+CWG motion 4: P1091R3 "Extending structured bindings to be more like variable declarations"
+
+CWG motion 5: P1381R1 "Reference capture of structured bindings"
+
+CWG motion 6: P1041R4 "Make char16_t
/char32_t
string literals be UTF-16/32"
+
+CWG motion 7: P1139R2 "Address wording issues related to ISO 10646"
+
+CWG motion 8: P1323R2 "Contract postconditions and return type deduction"
+
+CWG motion 9: P0960R3 "Allow initializing aggregates from a parenthesized list of values"
+
+CWG motion 10: P1009R2 "Array size deduction in new-expressions" (DR)
+
+CWG motion 11: P1103R3 "Modules"
+
+CWG motion 12: P1185R2 "<=>
!=
==
"
+
+CWG motions 13 and 14 apply to the Reflection TS
+
+CWG motion 15: P0912R5 "Coroutines"
+
+Core motions added a total of 24 pages (and 1 Clause) to Clause 1-15
+
+Library working group motions
+
+LWG motion 1 applies to the Library Fundamentals TS
+
+LWG motion 2: Library issue resolutions for 2 issues in Ready status and 11 issues in Tentatively Ready status applied:
+
+
+- 3012
atomic
is unimplementable for non-is_trivially_copy_constructible
T
+- 3040
basic_string_view::starts_with
Effects are incorrect
+- 3077 (
push
|emplace
)_back
should invalidate the end iterator
+- 3087 One final
&x
in [list.ops]
+- 3101
span
's Container
constructors need another constraint
+- 3112
system_error
and filesystem_error
constructors taking a string
may not be able to meet their postconditions
+- 3119 Program-definedness of closure types
+- 3133 Modernizing numeric type requirements
+- 3144
span
does not have a const_pointer
typedef
+- 3173 Enable CTAD for
ref-view
+- 3179
subrange
should always model Range
+- 3180 Inconsistently named return type for
ranges::minmax_element
+- 3182 Specification of
Same
could be clearer
+
+
+LWG motion 3: P0339R6 "polymorphic_allocator<>
as a vocabulary type"
+
+LWG motion 4: P0340R3 "Making std::underlying_type
SFINAE-friendly"
+
+LWG motion 5 was retracted
+
+LWG motion 6: P0738R2 "I Stream, You Stream, We All Stream for istream_iterator
"
+
+LWG motion 7: P1458R1 "Mandating the standard library: clause 16 - language support library"
+
+LWG motion 8: P1459R1 "Mandating the standard library: clause 18 - diagnostics library"
+
+LWG motion 9: P1462R1 "Mandating the standard library: clause 20 - strings library"
+
+LWG motion 10: P1463R1 "Mandating the standard library: clause 21 - containers library"
+
+LWG motion 11: P1464R1 "Mandating the standard library: clause 22 - iterators library"
+
+LWG motion 12: P1164R1 "Make create_directory()
intuitive" (DR)
+
+LWG motion 13: P0811R3 "Well-behaved interpolation for numbers and pointers"
+
+LWG motion 14: P1001R2 "Target vectorization policies from Parallelism V2 TS"
+
+LWG motion 15: P1227R2 "Signed ssize()
functions, unsigned size()
functions "
+
+LWG motion 16: P1252R2 "Ranges design cleanup"
+
+LWG motion 17: P1024R3 "Usability enhancements for std::span
"
+
+LWG motion 18: P0920R2 "Precalculated hash values in lookup"
+
+LWG motion 19: P1357R1 "Traits for [un]bounded arrays"
+
+Library motions added a total of 7 pages to Clause 16-32.
+
+Notable editorial changes
+
+CWG motion 1
+
+The edits for CWG2310 inadvertantly required the base class to be complete
+instead of the derived class in one of the edits. After consultation with CWG,
+the derived class is now required to be complete in all cases.
+
+The edits for CWG2331 were intended to be an editorial cleanup and wording
+simplification, but were found to have unintentional normative effect. This
+issue is being returned to CWG for redrafting.
+
+The edits for CWG2332 added a note that was not entirely accurate. The note,
+along with the normative text that it references, have been rephrased to
+clarify that an injected-class-name is never interpreted as a template-name
+in a context in which class template argument deduction would apply (even
+though it can be interpreted as a template-name in some cases in a context
+where a decl-specifier might be parsed, such as in a template-argument).
+
+CWG motion 2
+
+The wording moved for CWG2020 inadvertantly omitted some edits that were part
+of the wording reviewed by CWG. Those edits were not substantive, and have been
+restored editorially.
+
+CWG motion 12
+
+Removed redundant restatement of the operator==
symmetry rule in defaulted
+operator!=
; looking for reversed candidates and rewriting ==
expressions is
+already handled by overload resolution, and a reversed operator==
can never
+be selected anyway because the two arguments are of the same type.
+
+Likewise the corresponding redundant wording was removed from the rules for
+defaulted operators <
, >
, <=
, and >=
that inaccurately claimed they
+could select a reversed operator<=>
.
+
+CWG motion 15
+
+Modernized the wording to follow current editorial conventions, and simplified
+where possible.
+
+Fixed a contradiction between the core and library wording; the library wording
+allowed a coroutine_handle<>
to resume any coroutine, but the core wording
+did not account for that possibility and only permitted resumption via a
+coroutine_handle<P>
with the right promise type P
.
+
+LWG motion 2
+
+Replaced the references to CopyConstructible and CopyAssignable with the
+intended Cpp17CopyConstructible and Cpp17CopyAssignable after consultation
+with LWG.
+
+Section label changes
+
+Several section labels introduced by the motions papers have been modified
+to match our style guide. In addition to the section labels affected by the
+above motions, all section labels containing underscores have been renamed
+to instead use periods.
+
+Reversion of prior editorial change
+
+In N4791 (the post-San-Diego working draft), an editorial change was applied
+to repair missing wording in 2018-11 CWG motion 14
+(P0595R2 "std::is_constant_evaluated()
").
+This change added a definition of the term "usable in constant expressions"
+as applied to objects and references that was inadvertantly dropped from the
+wording during CWG review.
+
+Further review within CWG has shown that the dropped wording is also incorrect,
+so the editorial fix has been reverted (leaving the definition absent rather
+than incorrect), and a proper definition will be inserted by a core issue.
+
+Minor editorial fixes
+
+A log of editorial fixes made to the working draft since N4800 is below.
+This list excludes changes
+that do not affect the body text or only affect whitespace or typeface. For a
+complete list including such changes (or for the actual deltas applied by these
+changes), consult the draft sources on github.
+
+commit 142acf0bbde8d6fd20cb67c051d896fec33a84b6
+Author: stryku <stryku2393@gmail.com>
+Date: Thu Oct 11 18:41:18 2018 +0200
+
+ [decl.init]/10 Fix specified initialization.
+
+ According to [basic.start.static]/2, for objects with static storage duration,
+ zero initialization performs only if constant initialization does not.
+ [decl.init]/10 can be generalized to static initialization.
+ This is an editorial note change.
+
+commit 74def77454a15b6cdb45be0f31916396b4b63b72
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 15 13:45:06 2019 -0700
+
+ [util.smartptr.atomic.shared] [util.smartptr.atomic.weak] Clarify
+ grouping of "either".
+
+commit 4c5701a79cc7c4cc7b9cd9c6070e3cd88961aca7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Dec 21 21:04:43 2018 +0100
+
+ [mismatch] LWG3178 std::mismatch is missing an upper bound
+
+commit 04a5e31a02e19e5d1c9e9a0b05c40ce8730c7064
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sat Jan 26 00:30:13 2019 +0100
+
+ [algorithms] Qualify declarator-id with sub-namespace.
+
+ Also qualify return types where appropriate.
+
+commit 6c844190a533950fc0100eac4da7785d99c87400
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 15 20:25:59 2019 +0100
+
+ [time.clock.req] Change 'satisfy' to 'meet'.
+
+commit c3adaef44b94cc63a8a8806f398185046461947c
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 15 19:23:30 2019 +0100
+
+ [numeric.requirements] Define 'numeric type'.
+
+commit 1ce86a62a3cff9fb2bcf6c1a2c37168e023e338b
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sat Mar 9 22:18:26 2019 +0100
+
+ [time.clock.req] Simplify requirements for Cpp17TrivialClock.
+
+commit 0ba5424c1beddfd8c8403ce882b96dee0f530c7f
+Author: JF Bastien <github@jfbastien.com>
+Date: Fri Mar 15 13:52:39 2019 -0700
+
+ [basic.fundamental] Rename 'range exponent' to 'width' to align with C
+
+commit 9e00558f2a824421406a6703d1232cc4fb89bb15
+Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
+Date: Fri Mar 15 16:43:16 2019 -0400
+
+ [std] Fix a bunch of faulty parallelism with "either".
+
+commit 54ddcb970132bfe026c9d9d62d967632b56ae303
+Author: BRevzin <barry.revzin@gmail.com>
+Date: Fri Mar 15 15:30:07 2019 -0500
+
+ [class.rel] Simplifying wording to avoid talking about a reversed <=>.
+
+ We can never select a reversed <=> here because the operands are of the same type.
+
+commit 5d174b05d8cd08717ed7efc05d0271409651071c
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 15 12:33:42 2019 -0700
+
+ [expr.prim.lambda.capture] Convert paragraphs repeating the
+ "non-odr-usable local entities shall not be odr-used" rule from
+ [basic.def.odr] into notes.
+
+commit 41853024e5e6fcd5feb496f64767d2888d76154f
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 15 11:38:57 2019 -0700
+
+ Revert "[expr.const] Add missing definition of 'usable in constant expressions'"
+
+ The prior editorial fix was an attempt to re-add wording that was
+ missing from P0595R2 (moved as 2018-11 CWG Motion 14). However, CWG
+ analysis has indicated that the editorial fix is incomplete, so we're
+ reverting it to restore the wording to the as-moved state.
+
+ This reverts commit e58439bce8af85e6569328272c2cfb73f5fc44d6.
+
+commit 154f2c59c4377897937f4b0722cfe2b6d726cc59
+Author: birbacher <frank.birbacher@gmail.com>
+Date: Fri Mar 15 18:39:16 2019 +0000
+
+ [container.node] Add 3 "template" keywords for dependent name (#2676)
+
+ On:
+ [container.node.overview]/4
+ [container.node.cons]/3.1
+ [container.node.dtor]/1
+
+commit 2585d7f5894b46e0aa2f961183060a5201b2cca7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Dec 21 19:29:38 2018 +0100
+
+ [std] Replace underscores in stable labels with periods.
+
+commit 554a8926404bd5e0f772a6cb72c04bd12a5b7984
+Author: Casey Carter <Casey@Carter.net>
+Date: Mon Mar 4 09:29:50 2019 -0800
+
+ [specialized.algorithms] Rename voidify's parameter
+
+ `ptr` is an odd name for a parameter that is a reference to storage for an object.
+
+commit a2dfa61a0d50a24e7be6cbc004bb0f076b8c62b5
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 8 22:25:38 2019 +0100
+
+ [queue.syn,stack.syn] Add partial specialization of uses_allocator
+
+commit 721f2d606f90cc20a16ad9b4383bc78cb368abdc
+Author: Jonathan Wakely <github@kayari.org>
+Date: Fri Mar 15 02:53:18 2019 +0000
+
+ [func.not_fn], [func.bind_front] fix phrasing of \mandates and \expects (#2750)
+
+ The Mandates: element should just state its condition, and not say "shall".
+ Cpp17 concept requirements should be phrased as "X meets the
+ Y requirements" not "X shall meet the requirements of Y".
+
+commit 48484c967ee5f3ecb65ff857f8f4794e108ba0cb
+Author: Krystian <sdkrystian@gmail.com>
+Date: Thu Mar 14 22:49:33 2019 -0400
+
+ [temp.class.spec.mfunc] Correct "class template specialization" to the intended "class template partial specialization"
+
+commit 3117814eaf800a5e1dd387f4c5a0522f2627689e
+Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
+Date: Fri Mar 15 05:48:28 2019 +0300
+
+ [expr.sizeof] Remove the redundant paragraph 3
+
+ Paragraph 1 already says that functions are disallowed and function pointers are allowed.
+
+commit c769f835dadd4a35df9febad684a296d6cb71a53
+Author: JF Bastien <github@jfbastien.com>
+Date: Thu Mar 14 19:45:53 2019 -0700
+
+ [dcl.attr.contract.cond] Replace return type with 'void' in example that does not return
+
+ Also remove the (unused) name for the return value in the postcondition.
+
+commit d48c79e223cfbd5ec134703e20989235208e9364
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 8 01:14:16 2019 +0100
+
+ [dcl.enum] Fix singular/plural mismatch.
+
+commit c5fb73ba6a9b71f6e247103ab4baac1c9f72e210
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 8 01:13:35 2019 +0100
+
+ [conv.prom] b_min and b_max are no longer defined in [dcl.enum]
+
+commit d7d2580c7d8fabe25ada4dd0e091f9997c0916f5
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sat Mar 9 22:36:47 2019 +0100
+
+ [range.iota,range.adaptors] Add cross-references for private member types.
+
+commit b8fd249c737ff2c3652cf6ef77db25712038d353
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Mar 10 20:20:10 2019 +0100
+
+ [dcl.init] Prepend 'Otherwise' to a bullet
+
+commit dd227824ade24ab51dd4cc926c4b9e87cc29becf
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Mar 10 20:28:41 2019 +0100
+
+ [dcl.attr.contract.cond] References cannot be modified.
+
+ Avoid confusion caused by using the words "makes [...]
+ modifications of the value of [a] parameter" by excluding
+ references.
+
+commit b0116b87bf33fed9648e6e8b1b0c7cee0d90b311
+Author: Jason Merrill <jason@redhat.com>
+Date: Tue Mar 12 09:06:23 2019 -0400
+
+ [over.match.best] Add number for paragraph 2.
+
+commit f0f7ba234644d3690d18fcba73f618648014a47c
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Mar 13 22:21:42 2019 +0100
+
+ [lib] Use '(inclusive)', not other punctuation
+
+ to indicate inclusive ranges in prose.
+
+commit 5ba461ec9836f95ed7a54b563b06d480f564e987
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Mar 13 22:46:19 2019 +0100
+
+ [class.eq,class.spaceship] Clarify order of comparison.
+
+commit 42e5df5c08c9ef805da304fe05fe387cfc3d33d5
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Thu Mar 14 00:02:25 2019 +0100
+
+ [basic.lookup.argdep] Reorder bullets to group semantics.
+
+commit 927dc13e1010e031692f3a94d8e9599beeb877ac
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Thu Mar 14 17:22:07 2019 -0700
+
+ [array.tuple] Fix broken description of tuple_element for std::array.
+
+commit 0b06fcd5f92bc0439a868471a5fdfdba8a181941
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Fri Mar 8 22:12:14 2019 +0100
+
+ [ranges.syn] Add ref_view to header synopsis.
+
+commit 6f6e5772b2a2dcf41e3db4f68b6cbc3c0628c061
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Thu Mar 14 16:05:33 2019 -0700
+
+ [algorithms.parallel.exec] Rephrase to avoid incorrect use of "may not".
+
+ Convert rationale sentence to a note.
+
+commit de76c7de8c4f9734e0e4351d2088d4786ee62135
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Mar 5 21:57:10 2019 +0100
+
+ [char.traits.typedefs] Change 'shall meet' to 'meets'
+
+commit e11e27a7873953f0c078901f7ddbb0d7d701c5f7
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Mar 6 21:15:37 2019 +0100
+
+ [mem.poly.allocator.mem] Avoid duplicate colons.
+
+commit 2956ba37186d7e9cbe728cc3870a2a26fb1f0168
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Wed Mar 13 14:14:43 2019 -0700
+
+ [dcl.fct.def.coroutine] Update wording to align with current editorial
+ conventions.
+
+ Reorder and rearrange to reduce the number of variables with long scopes
+ that we define in the wording.
+
+ Fix mismatch between core and library wording where library permits
+ coroutine_handle<void> to resume a coroutine with any promise type, and
+ the core language does not.
+
+commit 8dd4539b24473677809163f5e6d399ba6aa0b27d
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Tue Mar 12 18:15:59 2019 -0700
+
+ [expr.await] Rephrase and modernize wording.
+
+ Invoke temporary materialization conversion directly rather than
+ handwaving about a temporary object. Specify that the o expression is
+ evaluated. Bulletize description of the three different ways that
+ await-suspend is called.
+
+ Fix wording that uses values and objects on the left-hand side of a
+ class member access to instead consistently use expressions.
+
+ Fixes #2774.
+
+commit d69814f61077f7e549ccc39a21fc3b90db4223d6
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Mar 11 20:12:17 2019 -0700
+
+ [temp.param] "a type that is literal" -> "a literal type".
+
+commit c0058816fdfe079095ca8717ad692dc2d498d6a3
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Mar 11 20:11:46 2019 -0700
+
+ [class.eq] Remove redundant repetition of the operator== symmetry rule.
+
+commit 007c0c1a619417f94c2c4efb57be71c09f2c2870
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Mar 6 21:32:09 2019 +0100
+
+ [temp.type] Do not refer to operator==, which excludes built-in ==.
+
+commit caa5c8aedecdf68cfda4f5d95ec9d20451953117
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Tue Mar 5 19:05:25 2019 +0100
+
+ [class.compare.default] Add a note that friends are found by ADL only.
+
+commit c9074b533c835bbf820f5ea09957810ed2c04dab
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Wed Mar 6 20:56:58 2019 +0100
+
+ [expr.new] Move treatment of arrays of unknown bound
+
+commit ce2f08ab94123adb44e58f1176c6ae4f3209eb60
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Mar 11 17:20:25 2019 -0700
+
+ [dcl.init] Merge new direct aggregate init wording into class direct
+ initialization bullet to avoid the wording being unreachable due to an
+ "Otherwise" chain.
+
+commit 691b7c10530d3265afbf445dff3dd129c7c5692e
+Author: Dawn Perchik <dperchik@embarcadero.com>
+Date: Sun Mar 10 16:15:53 2019 -0700
+
+ [dcl.init] Moved the changed bullet in 17.5 to before 17.6.3.
+
+commit 5f7461d24bc0e9867458a043adf04aa8c4ceed73
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 8 16:11:34 2019 -0800
+
+ [temp.dep.type] Rephrase to avoid suggesting that an expression can be
+ the current instantiation.
+
+ A type can't be the current instantiation either, but that's a
+ pre-existing prevalent problem.
+
+commit cbb21fb0210b6aade5591de94e3a27d7059e9d06
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 8 16:08:02 2019 -0800
+
+ [basic.def.odr] Apply additional edits from CWG review that were not
+ transcribed into P1359R0.
+
+commit ac732bfe4eef01e9e2443dac6138270695d7cbf9
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 8 12:24:49 2019 -0800
+
+ [expr.prim.lambda.capture] Add missing close parentheses in CWG2358
+ examples.
+
+ Fixes #2680.
+
+commit 502e419ca75c9656394d1998036b4b810e8bdb17
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 8 12:00:26 2019 -0800
+
+ [dcl.type.simple] Fix inaccurate note added by CWG2332
+
+ [temp.local] Clarify that the surrounding syntax and construct directly
+ dictates whether an injected-class-name is syntactically a template-name
+ or a type-name, not just what it means.
+
+commit f4346ece403e469e800d635a75baafb9c411aa1b
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Fri Mar 8 11:39:36 2019 -0800
+
+ [expr.static.cast] Fix wording of CWG2310 to match CWG intent (verified
+ on core reflector):
+
+ - in p11, require D to be a complete class type, not B
+ - in p12, rephrase to avoid the suggestion that we're talking about a
+ different D than the one already in scope
+
+commit 6f34b0513ed6d974b86a27429f8f4d02a6c18b88
+Author: Hana Dusíková <hanicka@hanicka.net>
+Date: Fri Feb 22 11:03:29 2019 -1000
+
+ [pair.astuple, tuple.helper] Fix inconsistent class key in tuple_size/tuple_element. (#2679)
+
+ It was declared as a struct and specializations were classes.
+
+commit 102a791b446f70f939a9b1e2e66fc3553aade19c
+Author: Johel Ernesto Guerrero Peña <johelegp@gmail.com>
+Date: Fri Feb 22 02:30:23 2019 -0400
+
+ [array.syn] Add reference to [array.tuple]
+
+commit 7fe655909b4e5f01d8a8b71d6b508785c42c739e
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Wed Feb 20 17:04:55 2019 -1000
+
+ [temp.dep] [temp.dep.res] Remove redundant restatement of the two-phase
+ lookup rule. The primary location of the rule is [temp.dep.candidate].
+
+commit 8fbeb52ae5daccc0352798ff023f6cba6aebcd42
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Mon Feb 18 17:15:39 2019 -1000
+
+ [basic.link] The notion of the linkage of a type is no longer used for
+ any purpose. Remove it and move its example next to the rule that
+ justifies it, and simplify said example.
+
+commit cafdbd8036f3cf19e9cfc2f56584b219fb190602
+Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
+Date: Fri Jan 25 00:12:44 2019 +0300
+
+ [expr.sizeof]/2: there are no expressions of reference type
+
+commit 35ce0ae2eb2582dbc00fc824afbfa1d53a64de8d
+Author: Richard Smith <richard@metafoo.co.uk>
+Date: Wed Feb 13 17:51:58 2019 -0800
+
+ [depr.array.comp] Fix example of deprecated array comparison
+
+commit 2f0bd979f41953890129fcbdc6ef37e3e90387ad
+Author: Alisdair Meredith <alisdairm@me.com>
+Date: Sun Feb 10 16:53:15 2019 -0500
+
+ Add missing noexcept cross-refs for invokable traits (#2662)
+
+ All the other traits that use the phrase 'is known not to throw exceptions' also cross-reference the core clause for the noexcept operator, so add the missing cross reference to the more recently added traits.
+
+commit 9f261368736c3666791329145292c1563a291861
+Author: Alberto Barbati <2210776+iaanus@users.noreply.github.com>
+Date: Sun Feb 10 22:52:36 2019 +0100
+
+ [temp.mem.func] Fixed text in example, which was not updated by CWG 249 (#2658)
+
+commit f668df034ebf27ad53b5addad22af4f1293f829f
+Author: Jens Maurer <Jens.Maurer@gmx.net>
+Date: Sun Feb 10 22:50:42 2019 +0100
+
+ [algorithms.general,concepts.general] Add missing entries for summary tables (#2663)
+
diff --git a/papers/n4811.md b/papers/n4811.md
new file mode 100644
index 0000000000..525110b06f
--- /dev/null
+++ b/papers/n4811.md
@@ -0,0 +1,672 @@
+# N4811 Editors' Report -- Programming Languages -- C++
+
+2019-03-15
+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 Marshall Clow
+for supplying the LaTeX sources for
+
+ * [P1458R1](http://wg21.link/p1458r1) (LWG motion 7, 42 pages of wording changes)
+ * [P1459R1](http://wg21.link/p1459r1) (LWG motion 8, 15 pages of wording changes)
+ * [P1463R1](http://wg21.link/p1463r1) (LWG motion 10, 119 pages of wording changes) and
+ * [P1464R1](http://wg21.link/p1464r1) (LWG motion 11, 60 pages of wording changes)
+
+and to Gor Nishanov
+for supplying a pull request for
+[P0912R5](http://wg21.link/p0912r5) (CWG motion 15, 22 pages of wording changes).
+
+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
+
+ * [N4810](http://wg21.link/n4810) is the current working draft for C++20. It replaces [N4800](http://wg21.link/n4800).
+ * N4811 is this Editors' Report.
+
+## Motions incorporated into working draft
+
+### Core working group motions
+
+CWG motion 1: [Core issue resolutions](http://wg21.link/p1358r0) for 14 issues in "ready" status applied, 1 not applied:
+
+ * [2256](http://wg21.link/cwg2256) Lifetime of trivially-destructible objects
+ * [2267](http://wg21.link/cwg2267) Copy-initialization of temporary in reference direct-initialization
+ * [2278](http://wg21.link/cwg2278) Copy elision in constant expressions reconsidered
+ * [2303](http://wg21.link/cwg2303) Partial ordering and recursive variadic inheritance
+ * [2309](http://wg21.link/cwg2309) Restrictions on nested statements within constexpr functions
+ * [2310](http://wg21.link/cwg2310) Type completeness and derived-to-base pointer conversions **see below**
+ * [2317](http://wg21.link/cwg2317) Self-referential default member initializers
+ * [2318](http://wg21.link/cwg2318) Nondeduced contexts in deduction from a *braced-init-list*
+ * [2330](http://wg21.link/cwg2330) Missing references to variable templates
+ * [2331](http://wg21.link/cwg2331) Redundancy in description of class scope **not applied, see below**
+ * [2332](http://wg21.link/cwg2332) *template-name* as *simple-type-name* vs *injected-class-name* **see below**
+ * [2336](http://wg21.link/cwg2336) Destructor characteristics vs potentially-constructed subobjects
+ * [2352](http://wg21.link/cwg2352) Similar types and reference binding
+ * [2358](http://wg21.link/cwg2358) Explicit capture of value
+ * [2360](http://wg21.link/cwg2360) `[[maybe_unused]]` and structured bindings
+
+CWG motion 2: [Core issue resolutions](http://wg21.link/p1359r0) for 22 issues in "tentatively ready" status applied, resolving 24 issues:
+
+ * [581](http://wg21.link/cwg581) Can a templated constructor be explicitly instantiated or specialized?
+ * [1937](http://wg21.link/cwg1937) Incomplete specification of function pointer from lambda
+ * [1938](http://wg21.link/cwg1938) Should hosted/freestanding be implementation-defined?
+ * [2020](http://wg21.link/cwg2020) Inadequate description of odr-use of implicitly-invoked functions **see below**
+ * [2051](http://wg21.link/cwg2051) Simplifying alias rules
+ * [2083](http://wg21.link/cwg2083) Incorrect cases of odr-use
+ * [2103](http://wg21.link/cwg2103) Lvalue-to-rvalue conversion is irrelevant in odr-use of a reference **resolved by 2083**
+ * [2170](http://wg21.link/cwg2170) Unclear definition of odr-use for arrays **resolved by 2083**
+ * [2257](http://wg21.link/cwg2257) Lifetime extension of references vs exceptions
+ * [2266](http://wg21.link/cwg2266) Has dependent type vs is type-dependent
+ * [2289](http://wg21.link/cwg2289) Uniqueness of structured binding names
+ * [2353](http://wg21.link/cwg2353) Potential results of a member access expression for a static data member
+ * [2354](http://wg21.link/cwg2354) Extended alignment and object representation
+ * [2365](http://wg21.link/cwg2365) Confusing specification for `dynamic_cast`
+ * [2368](http://wg21.link/cwg2368) Differences in relational and three-way constant comparisons
+ * [2372](http://wg21.link/cwg2372) Incorrect matching rules for block-scope extern declarations
+ * [2379](http://wg21.link/cwg2379) Missing prohibition against `constexpr` in friend declaration
+ * [2380](http://wg21.link/cwg2380) *capture-default* makes too many references odr-usable
+ * [2381](http://wg21.link/cwg2381) Composite pointer type of pointers to plain and `noexcept` member functions
+ * [2384](http://wg21.link/cwg2384) Conversion function templates and qualification conversions
+ * [2385](http://wg21.link/cwg2385) Lookup for *conversion-function-id*s
+ * [2386](http://wg21.link/cwg2386) `tuple_size` requirements for structured binding
+ * [2387](http://wg21.link/cwg2387) Linkage of const-qualified variable template
+ * [2394](http://wg21.link/cwg2394) Const-default-constructible for members
+
+CWG motion 3: [P1286R2 "Contra CWG DR1778"](http://wg21.link/p1286r2) **(DR)**
+
+ * Alters resolution of [1778](http://wg21.link/cwg1778) *exception-specification* in explicitly-defaulted functions
+
+CWG motion 4: [P1091R3 "Extending structured bindings to be more like variable declarations"](http://wg21.link/p109133)
+
+CWG motion 5: [P1381R1 "Reference capture of structured bindings"](http://wg21.link/p138131)
+
+CWG motion 6: [P1041R4 "Make `char16_t`/`char32_t` string literals be UTF-16/32"](http://wg21.link/p104134)
+
+CWG motion 7: [P1139R2 "Address wording issues related to ISO 10646"](http://wg21.link/p113932)
+
+CWG motion 8: [P1323R2 "Contract postconditions and return type deduction"](http://wg21.link/p132332)
+
+CWG motion 9: [P0960R3 "Allow initializing aggregates from a parenthesized list of values"](http://wg21.link/p096033)
+
+CWG motion 10: [P1009R2 "Array size deduction in *new-expressions*"](http://wg21.link/p1009r2) **(DR)**
+
+CWG motion 11: [P1103R3 "Modules"](http://wg21.link/p110333)
+
+CWG motion 12: [P1185R2 "`<=>` `!=` `==`"](http://wg21.link/p118532)
+
+CWG motions 13 and 14 apply to the Reflection TS
+
+CWG motion 15: [P0912R5 "Coroutines"](http://wg21.link/p091235)
+
+Core motions added a total of 24 pages (and 1 Clause) to Clause 1-15
+
+### Library working group motions
+
+LWG motion 1 applies to the Library Fundamentals TS
+
+LWG motion 2: [Library issue resolutions](http://wg21.link/p1457r0) for 2 issues in Ready status and 11 issues in Tentatively Ready status applied:
+
+ * [3012](http://wg21.link/lwg3012) `atomic` is unimplementable for non-`is_trivially_copy_constructible` `T`
+ * [3040](http://wg21.link/lwg3040) `basic_string_view::starts_with` *Effects* are incorrect
+ * [3077](http://wg21.link/lwg3077) (`push`|`emplace`)`_back` should invalidate the end iterator
+ * [3087](http://wg21.link/lwg3087) One final `&x` in [list.ops]
+ * [3101](http://wg21.link/lwg3101) `span`'s `Container` constructors need another constraint
+ * [3112](http://wg21.link/lwg3112) `system_error` and `filesystem_error` constructors taking a `string` may not be able to meet their postconditions
+ * [3119](http://wg21.link/lwg3119) Program-definedness of closure types
+ * [3133](http://wg21.link/lwg3133) Modernizing numeric type requirements
+ * [3144](http://wg21.link/lwg3144) `span` does not have a `const_pointer` typedef
+ * [3173](http://wg21.link/lwg3173) Enable CTAD for *`ref-view`*
+ * [3179](http://wg21.link/lwg3179) `subrange` should always model `Range`
+ * [3180](http://wg21.link/lwg3180) Inconsistently named return type for `ranges::minmax_element`
+ * [3182](http://wg21.link/lwg3182) Specification of `Same` could be clearer
+
+LWG motion 3: [P0339R6 "`polymorphic_allocator<>` as a vocabulary type"](http://wg21.link/p033936)
+
+LWG motion 4: [P0340R3 "Making `std::underlying_type` SFINAE-friendly"](http://wg21.link/p034033)
+
+LWG motion 5 was retracted
+
+LWG motion 6: [P0738R2 "I Stream, You Stream, We All Stream for `istream_iterator`"](http://wg21.link/p073832)
+
+LWG motion 7: [P1458R1 "Mandating the standard library: clause 16 - language support library"](http://wg21.link/p145831)
+
+LWG motion 8: [P1459R1 "Mandating the standard library: clause 18 - diagnostics library"](http://wg21.link/p145931)
+
+LWG motion 9: [P1462R1 "Mandating the standard library: clause 20 - strings library"](http://wg21.link/p146231)
+
+LWG motion 10: [P1463R1 "Mandating the standard library: clause 21 - containers library"](http://wg21.link/p146331)
+
+LWG motion 11: [P1464R1 "Mandating the standard library: clause 22 - iterators library"](http://wg21.link/p146431)
+
+LWG motion 12: [P1164R1 "Make `create_directory()` intuitive"](http://wg21.link/p116431) **(DR)**
+
+LWG motion 13: [P0811R3 "Well-behaved interpolation for numbers and pointers"](http://wg21.link/p081133)
+
+LWG motion 14: [P1001R2 "Target vectorization policies from Parallelism V2 TS"](http://wg21.link/p100132)
+
+LWG motion 15: [P1227R2 "Signed `ssize()` functions, unsigned `size()` functions "](http://wg21.link/p122732)
+
+LWG motion 16: [P1252R2 "Ranges design cleanup"](http://wg21.link/p125232)
+
+LWG motion 17: [P1024R3 "Usability enhancements for `std::span`"](http://wg21.link/p102433)
+
+LWG motion 18: [P0920R2 "Precalculated hash values in lookup"](http://wg21.link/p092032)
+
+LWG motion 19: [P1357R1 "Traits for [un]bounded arrays"](http://wg21.link/p135731)
+
+Library motions added a total of 7 pages to Clause 16-32.
+
+## Notable editorial changes
+
+### CWG motion 1
+
+The edits for CWG2310 inadvertantly required the base class to be complete
+instead of the derived class in one of the edits. After consultation with CWG,
+the derived class is now required to be complete in all cases.
+
+The edits for CWG2331 were intended to be an editorial cleanup and wording
+simplification, but were found to have unintentional normative effect. This
+issue is being returned to CWG for redrafting.
+
+The edits for CWG2332 added a note that was not entirely accurate. The note,
+along with the normative text that it references, have been rephrased to
+clarify that an injected-class-name is never interpreted as a *template-name*
+in a context in which class template argument deduction would apply (even
+though it can be interpreted as a *template-name* in some cases in a context
+where a *decl-specifier* might be parsed, such as in a *template-argument*).
+
+### CWG motion 2
+
+The wording moved for CWG2020 inadvertantly omitted some edits that were part
+of the wording reviewed by CWG. Those edits were not substantive, and have been
+restored editorially.
+
+### CWG motion 12
+
+Removed redundant restatement of the `operator==` symmetry rule in defaulted
+`operator!=`; looking for reversed candidates and rewriting `==` expressions is
+already handled by overload resolution, and a reversed `operator==` can never
+be selected anyway because the two arguments are of the same type.
+
+Likewise the corresponding redundant wording was removed from the rules for
+defaulted operators `<`, `>`, `<=`, and `>=` that inaccurately claimed they
+could select a reversed `operator<=>`.
+
+### CWG motion 15
+
+Modernized the wording to follow current editorial conventions, and simplified
+where possible.
+
+Fixed a contradiction between the core and library wording; the library wording
+allowed a `coroutine_handle<>` to resume any coroutine, but the core wording
+did not account for that possibility and only permitted resumption via a
+`coroutine_handle` with the right promise type `P`.
+
+### LWG motion 2
+
+Replaced the references to *CopyConstructible* and *CopyAssignable* with the
+intended *Cpp17CopyConstructible* and *Cpp17CopyAssignable* after consultation
+with LWG.
+
+### Section label changes
+
+Several section labels introduced by the motions papers have been modified
+to match our style guide. In addition to the section labels affected by the
+above motions, all section labels containing underscores have been renamed
+to instead use periods.
+
+### Reversion of prior editorial change
+
+In N4791 (the post-San-Diego working draft), an editorial change was applied
+to repair missing wording in 2018-11 CWG motion 14
+([P0595R2 "`std::is_constant_evaluated()`"](http://wg21.link/p0595r2)).
+This change added a definition of the term "usable in constant expressions"
+as applied to objects and references that was inadvertantly dropped from the
+wording during CWG review.
+
+Further review within CWG has shown that the dropped wording is also incorrect,
+so the editorial fix has been reverted (leaving the definition absent rather
+than incorrect), and a proper definition will be inserted by a core issue.
+
+## Minor editorial fixes
+
+A log of editorial fixes made to the working draft since N4800 is below.
+This list excludes changes
+that do not affect the body text or only affect whitespace or typeface. For a
+complete list including such changes (or for the actual deltas applied by these
+changes), consult the [draft sources on github](https://github.com/cplusplus/draft/compare/n4800...n4810).
+
+ commit 142acf0bbde8d6fd20cb67c051d896fec33a84b6
+ Author: stryku
+ Date: Thu Oct 11 18:41:18 2018 +0200
+
+ [decl.init]/10 Fix specified initialization.
+
+ According to [basic.start.static]/2, for objects with static storage duration,
+ zero initialization performs only if constant initialization does not.
+ [decl.init]/10 can be generalized to static initialization.
+ This is an editorial note change.
+
+ commit 74def77454a15b6cdb45be0f31916396b4b63b72
+ Author: Richard Smith
+ Date: Fri Mar 15 13:45:06 2019 -0700
+
+ [util.smartptr.atomic.shared] [util.smartptr.atomic.weak] Clarify
+ grouping of "either".
+
+ commit 4c5701a79cc7c4cc7b9cd9c6070e3cd88961aca7
+ Author: Jens Maurer
+ Date: Fri Dec 21 21:04:43 2018 +0100
+
+ [mismatch] LWG3178 std::mismatch is missing an upper bound
+
+ commit 04a5e31a02e19e5d1c9e9a0b05c40ce8730c7064
+ Author: Jens Maurer
+ Date: Sat Jan 26 00:30:13 2019 +0100
+
+ [algorithms] Qualify declarator-id with sub-namespace.
+
+ Also qualify return types where appropriate.
+
+ commit 6c844190a533950fc0100eac4da7785d99c87400
+ Author: Jens Maurer
+ Date: Fri Mar 15 20:25:59 2019 +0100
+
+ [time.clock.req] Change 'satisfy' to 'meet'.
+
+ commit c3adaef44b94cc63a8a8806f398185046461947c
+ Author: Jens Maurer
+ Date: Fri Mar 15 19:23:30 2019 +0100
+
+ [numeric.requirements] Define 'numeric type'.
+
+ commit 1ce86a62a3cff9fb2bcf6c1a2c37168e023e338b
+ Author: Jens Maurer
+ Date: Sat Mar 9 22:18:26 2019 +0100
+
+ [time.clock.req] Simplify requirements for Cpp17TrivialClock.
+
+ commit 0ba5424c1beddfd8c8403ce882b96dee0f530c7f
+ Author: JF Bastien
+ Date: Fri Mar 15 13:52:39 2019 -0700
+
+ [basic.fundamental] Rename 'range exponent' to 'width' to align with C
+
+ commit 9e00558f2a824421406a6703d1232cc4fb89bb15
+ Author: Arthur O'Dwyer
+ Date: Fri Mar 15 16:43:16 2019 -0400
+
+ [std] Fix a bunch of faulty parallelism with "either".
+
+ commit 54ddcb970132bfe026c9d9d62d967632b56ae303
+ Author: BRevzin
+ Date: Fri Mar 15 15:30:07 2019 -0500
+
+ [class.rel] Simplifying wording to avoid talking about a reversed <=>.
+
+ We can never select a reversed <=> here because the operands are of the same type.
+
+ commit 5d174b05d8cd08717ed7efc05d0271409651071c
+ Author: Richard Smith
+ Date: Fri Mar 15 12:33:42 2019 -0700
+
+ [expr.prim.lambda.capture] Convert paragraphs repeating the
+ "non-odr-usable local entities shall not be odr-used" rule from
+ [basic.def.odr] into notes.
+
+ commit 41853024e5e6fcd5feb496f64767d2888d76154f
+ Author: Richard Smith
+ Date: Fri Mar 15 11:38:57 2019 -0700
+
+ Revert "[expr.const] Add missing definition of 'usable in constant expressions'"
+
+ The prior editorial fix was an attempt to re-add wording that was
+ missing from P0595R2 (moved as 2018-11 CWG Motion 14). However, CWG
+ analysis has indicated that the editorial fix is incomplete, so we're
+ reverting it to restore the wording to the as-moved state.
+
+ This reverts commit e58439bce8af85e6569328272c2cfb73f5fc44d6.
+
+ commit 154f2c59c4377897937f4b0722cfe2b6d726cc59
+ Author: birbacher
+ Date: Fri Mar 15 18:39:16 2019 +0000
+
+ [container.node] Add 3 "template" keywords for dependent name (#2676)
+
+ On:
+ [container.node.overview]/4
+ [container.node.cons]/3.1
+ [container.node.dtor]/1
+
+ commit 2585d7f5894b46e0aa2f961183060a5201b2cca7
+ Author: Jens Maurer
+ Date: Fri Dec 21 19:29:38 2018 +0100
+
+ [std] Replace underscores in stable labels with periods.
+
+ commit 554a8926404bd5e0f772a6cb72c04bd12a5b7984
+ Author: Casey Carter
+ Date: Mon Mar 4 09:29:50 2019 -0800
+
+ [specialized.algorithms] Rename voidify's parameter
+
+ `ptr` is an odd name for a parameter that is a reference to storage for an object.
+
+ commit a2dfa61a0d50a24e7be6cbc004bb0f076b8c62b5
+ Author: Jens Maurer
+ Date: Fri Mar 8 22:25:38 2019 +0100
+
+ [queue.syn,stack.syn] Add partial specialization of uses_allocator
+
+ commit 721f2d606f90cc20a16ad9b4383bc78cb368abdc
+ Author: Jonathan Wakely
+ Date: Fri Mar 15 02:53:18 2019 +0000
+
+ [func.not_fn], [func.bind_front] fix phrasing of \mandates and \expects (#2750)
+
+ The Mandates: element should just state its condition, and not say "shall".
+ Cpp17 concept requirements should be phrased as "X meets the
+ Y requirements" not "X shall meet the requirements of Y".
+
+ commit 48484c967ee5f3ecb65ff857f8f4794e108ba0cb
+ Author: Krystian
+ Date: Thu Mar 14 22:49:33 2019 -0400
+
+ [temp.class.spec.mfunc] Correct "class template specialization" to the intended "class template partial specialization"
+
+ commit 3117814eaf800a5e1dd387f4c5a0522f2627689e
+ Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
+ Date: Fri Mar 15 05:48:28 2019 +0300
+
+ [expr.sizeof] Remove the redundant paragraph 3
+
+ Paragraph 1 already says that functions are disallowed and function pointers are allowed.
+
+ commit c769f835dadd4a35df9febad684a296d6cb71a53
+ Author: JF Bastien
+ Date: Thu Mar 14 19:45:53 2019 -0700
+
+ [dcl.attr.contract.cond] Replace return type with 'void' in example that does not return
+
+ Also remove the (unused) name for the return value in the postcondition.
+
+ commit d48c79e223cfbd5ec134703e20989235208e9364
+ Author: Jens Maurer
+ Date: Fri Mar 8 01:14:16 2019 +0100
+
+ [dcl.enum] Fix singular/plural mismatch.
+
+ commit c5fb73ba6a9b71f6e247103ab4baac1c9f72e210
+ Author: Jens Maurer
+ Date: Fri Mar 8 01:13:35 2019 +0100
+
+ [conv.prom] b_min and b_max are no longer defined in [dcl.enum]
+
+ commit d7d2580c7d8fabe25ada4dd0e091f9997c0916f5
+ Author: Jens Maurer
+ Date: Sat Mar 9 22:36:47 2019 +0100
+
+ [range.iota,range.adaptors] Add cross-references for private member types.
+
+ commit b8fd249c737ff2c3652cf6ef77db25712038d353
+ Author: Jens Maurer
+ Date: Sun Mar 10 20:20:10 2019 +0100
+
+ [dcl.init] Prepend 'Otherwise' to a bullet
+
+ commit dd227824ade24ab51dd4cc926c4b9e87cc29becf
+ Author: Jens Maurer
+ Date: Sun Mar 10 20:28:41 2019 +0100
+
+ [dcl.attr.contract.cond] References cannot be modified.
+
+ Avoid confusion caused by using the words "makes [...]
+ modifications of the value of [a] parameter" by excluding
+ references.
+
+ commit b0116b87bf33fed9648e6e8b1b0c7cee0d90b311
+ Author: Jason Merrill
+ Date: Tue Mar 12 09:06:23 2019 -0400
+
+ [over.match.best] Add number for paragraph 2.
+
+ commit f0f7ba234644d3690d18fcba73f618648014a47c
+ Author: Jens Maurer
+ Date: Wed Mar 13 22:21:42 2019 +0100
+
+ [lib] Use '(inclusive)', not other punctuation
+
+ to indicate inclusive ranges in prose.
+
+ commit 5ba461ec9836f95ed7a54b563b06d480f564e987
+ Author: Jens Maurer
+ Date: Wed Mar 13 22:46:19 2019 +0100
+
+ [class.eq,class.spaceship] Clarify order of comparison.
+
+ commit 42e5df5c08c9ef805da304fe05fe387cfc3d33d5
+ Author: Jens Maurer
+ Date: Thu Mar 14 00:02:25 2019 +0100
+
+ [basic.lookup.argdep] Reorder bullets to group semantics.
+
+ commit 927dc13e1010e031692f3a94d8e9599beeb877ac
+ Author: Richard Smith
+ Date: Thu Mar 14 17:22:07 2019 -0700
+
+ [array.tuple] Fix broken description of tuple_element for std::array.
+
+ commit 0b06fcd5f92bc0439a868471a5fdfdba8a181941
+ Author: Jens Maurer
+ Date: Fri Mar 8 22:12:14 2019 +0100
+
+ [ranges.syn] Add ref_view to header synopsis.
+
+ commit 6f6e5772b2a2dcf41e3db4f68b6cbc3c0628c061
+ Author: Richard Smith
+ Date: Thu Mar 14 16:05:33 2019 -0700
+
+ [algorithms.parallel.exec] Rephrase to avoid incorrect use of "may not".
+
+ Convert rationale sentence to a note.
+
+ commit de76c7de8c4f9734e0e4351d2088d4786ee62135
+ Author: Jens Maurer
+ Date: Tue Mar 5 21:57:10 2019 +0100
+
+ [char.traits.typedefs] Change 'shall meet' to 'meets'
+
+ commit e11e27a7873953f0c078901f7ddbb0d7d701c5f7
+ Author: Jens Maurer
+ Date: Wed Mar 6 21:15:37 2019 +0100
+
+ [mem.poly.allocator.mem] Avoid duplicate colons.
+
+ commit 2956ba37186d7e9cbe728cc3870a2a26fb1f0168
+ Author: Richard Smith
+ Date: Wed Mar 13 14:14:43 2019 -0700
+
+ [dcl.fct.def.coroutine] Update wording to align with current editorial
+ conventions.
+
+ Reorder and rearrange to reduce the number of variables with long scopes
+ that we define in the wording.
+
+ Fix mismatch between core and library wording where library permits
+ coroutine_handle to resume a coroutine with any promise type, and
+ the core language does not.
+
+ commit 8dd4539b24473677809163f5e6d399ba6aa0b27d
+ Author: Richard Smith
+ Date: Tue Mar 12 18:15:59 2019 -0700
+
+ [expr.await] Rephrase and modernize wording.
+
+ Invoke temporary materialization conversion directly rather than
+ handwaving about a temporary object. Specify that the o expression is
+ evaluated. Bulletize description of the three different ways that
+ await-suspend is called.
+
+ Fix wording that uses values and objects on the left-hand side of a
+ class member access to instead consistently use expressions.
+
+ Fixes #2774.
+
+ commit d69814f61077f7e549ccc39a21fc3b90db4223d6
+ Author: Richard Smith
+ Date: Mon Mar 11 20:12:17 2019 -0700
+
+ [temp.param] "a type that is literal" -> "a literal type".
+
+ commit c0058816fdfe079095ca8717ad692dc2d498d6a3
+ Author: Richard Smith
+ Date: Mon Mar 11 20:11:46 2019 -0700
+
+ [class.eq] Remove redundant repetition of the operator== symmetry rule.
+
+ commit 007c0c1a619417f94c2c4efb57be71c09f2c2870
+ Author: Jens Maurer
+ Date: Wed Mar 6 21:32:09 2019 +0100
+
+ [temp.type] Do not refer to operator==, which excludes built-in ==.
+
+ commit caa5c8aedecdf68cfda4f5d95ec9d20451953117
+ Author: Jens Maurer
+ Date: Tue Mar 5 19:05:25 2019 +0100
+
+ [class.compare.default] Add a note that friends are found by ADL only.
+
+ commit c9074b533c835bbf820f5ea09957810ed2c04dab
+ Author: Jens Maurer
+ Date: Wed Mar 6 20:56:58 2019 +0100
+
+ [expr.new] Move treatment of arrays of unknown bound
+
+ commit ce2f08ab94123adb44e58f1176c6ae4f3209eb60
+ Author: Richard Smith
+ Date: Mon Mar 11 17:20:25 2019 -0700
+
+ [dcl.init] Merge new direct aggregate init wording into class direct
+ initialization bullet to avoid the wording being unreachable due to an
+ "Otherwise" chain.
+
+ commit 691b7c10530d3265afbf445dff3dd129c7c5692e
+ Author: Dawn Perchik
+ Date: Sun Mar 10 16:15:53 2019 -0700
+
+ [dcl.init] Moved the changed bullet in 17.5 to before 17.6.3.
+
+ commit 5f7461d24bc0e9867458a043adf04aa8c4ceed73
+ Author: Richard Smith
+ Date: Fri Mar 8 16:11:34 2019 -0800
+
+ [temp.dep.type] Rephrase to avoid suggesting that an expression can be
+ the current instantiation.
+
+ A type can't be the current instantiation either, but that's a
+ pre-existing prevalent problem.
+
+ commit cbb21fb0210b6aade5591de94e3a27d7059e9d06
+ Author: Richard Smith
+ Date: Fri Mar 8 16:08:02 2019 -0800
+
+ [basic.def.odr] Apply additional edits from CWG review that were not
+ transcribed into P1359R0.
+
+ commit ac732bfe4eef01e9e2443dac6138270695d7cbf9
+ Author: Richard Smith
+ Date: Fri Mar 8 12:24:49 2019 -0800
+
+ [expr.prim.lambda.capture] Add missing close parentheses in CWG2358
+ examples.
+
+ Fixes #2680.
+
+ commit 502e419ca75c9656394d1998036b4b810e8bdb17
+ Author: Richard Smith
+ Date: Fri Mar 8 12:00:26 2019 -0800
+
+ [dcl.type.simple] Fix inaccurate note added by CWG2332
+
+ [temp.local] Clarify that the surrounding syntax and construct directly
+ dictates whether an injected-class-name is syntactically a template-name
+ or a type-name, not just what it means.
+
+ commit f4346ece403e469e800d635a75baafb9c411aa1b
+ Author: Richard Smith
+ Date: Fri Mar 8 11:39:36 2019 -0800
+
+ [expr.static.cast] Fix wording of CWG2310 to match CWG intent (verified
+ on core reflector):
+
+ - in p11, require D to be a complete class type, not B
+ - in p12, rephrase to avoid the suggestion that we're talking about a
+ different D than the one already in scope
+
+ commit 6f34b0513ed6d974b86a27429f8f4d02a6c18b88
+ Author: Hana Dusíková
+ Date: Fri Feb 22 11:03:29 2019 -1000
+
+ [pair.astuple, tuple.helper] Fix inconsistent class key in tuple_size/tuple_element. (#2679)
+
+ It was declared as a struct and specializations were classes.
+
+ commit 102a791b446f70f939a9b1e2e66fc3553aade19c
+ Author: Johel Ernesto Guerrero Peña
+ Date: Fri Feb 22 02:30:23 2019 -0400
+
+ [array.syn] Add reference to [array.tuple]
+
+ commit 7fe655909b4e5f01d8a8b71d6b508785c42c739e
+ Author: Richard Smith
+ Date: Wed Feb 20 17:04:55 2019 -1000
+
+ [temp.dep] [temp.dep.res] Remove redundant restatement of the two-phase
+ lookup rule. The primary location of the rule is [temp.dep.candidate].
+
+ commit 8fbeb52ae5daccc0352798ff023f6cba6aebcd42
+ Author: Richard Smith
+ Date: Mon Feb 18 17:15:39 2019 -1000
+
+ [basic.link] The notion of the linkage of a type is no longer used for
+ any purpose. Remove it and move its example next to the rule that
+ justifies it, and simplify said example.
+
+ commit cafdbd8036f3cf19e9cfc2f56584b219fb190602
+ Author: languagelawyer <38548419+languagelawyer@users.noreply.github.com>
+ Date: Fri Jan 25 00:12:44 2019 +0300
+
+ [expr.sizeof]/2: there are no expressions of reference type
+
+ commit 35ce0ae2eb2582dbc00fc824afbfa1d53a64de8d
+ Author: Richard Smith
+ Date: Wed Feb 13 17:51:58 2019 -0800
+
+ [depr.array.comp] Fix example of deprecated array comparison
+
+ commit 2f0bd979f41953890129fcbdc6ef37e3e90387ad
+ Author: Alisdair Meredith
+ Date: Sun Feb 10 16:53:15 2019 -0500
+
+ Add missing noexcept cross-refs for invokable traits (#2662)
+
+ All the other traits that use the phrase 'is known not to throw exceptions' also cross-reference the core clause for the noexcept operator, so add the missing cross reference to the more recently added traits.
+
+ commit 9f261368736c3666791329145292c1563a291861
+ Author: Alberto Barbati <2210776+iaanus@users.noreply.github.com>
+ Date: Sun Feb 10 22:52:36 2019 +0100
+
+ [temp.mem.func] Fixed text in example, which was not updated by CWG 249 (#2658)
+
+ commit f668df034ebf27ad53b5addad22af4f1293f829f
+ Author: Jens Maurer
+ Date: Sun Feb 10 22:50:42 2019 +0100
+
+ [algorithms.general,concepts.general] Add missing entries for summary tables (#2663)
diff --git a/source/algorithms.tex b/source/algorithms.tex
index 4b61488ff1..5434dfa69c 100644
--- a/source/algorithms.tex
+++ b/source/algorithms.tex
@@ -16,11 +16,13 @@
as summarized in \tref{algorithms.summary}.
\begin{libsumtab}{Algorithms library summary}{tab:algorithms.summary}
+\ref{algorithms.requirements} & Algorithms requirements & \\
+\ref{algorithms.parallel} & Parallel algorithms & \\ \hline
\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
+\ref{alg.c.library} & C library algorithms & \tcode{} \\
\end{libsumtab}
\rSec1[algorithms.requirements]{Algorithms requirements}
@@ -311,6 +313,35 @@
\end{itemize}
\end{example}
+\pnum
+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.
+\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;
+void f() {
+ 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}
+
\rSec2[algorithms.parallel.user]{Requirements on user-provided function objects}
\pnum
@@ -376,11 +407,34 @@
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::unsequenced_policy}
+are permitted to execute in an unordered fashion
+in the calling thread of execution,
+unsequenced with respect to one another in the calling thread of execution.
+\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 overlap with one another.
+\end{note}
+The behavior of a program is undefined if
+it invokes a vectorization-unsafe standard library function
+from user code
+called from a \tcode{execution::unsequenced_policy} algorithm.
+\begin{note}
+Because \tcode{execution::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.
+\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
+are permitted to execute either
+in 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}
@@ -437,7 +491,7 @@
\pnum
The invocations of element access functions in parallel algorithms invoked with
-an execution policy of type \tcode{execution::parallel_unsequenced_policy} are
+an execution policy object 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.
@@ -449,48 +503,28 @@
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.
+that function executions do not overlap with one another.
\end{note}
-Since \tcode{execution::parallel_unsequenced_policy} allows
+The behavior of a program is undefined if
+it invokes a vectorization-unsafe standard library function
+from user code
+called from a \tcode{execution::parallel_unsequenced_policy} algorithm.
+\begin{note}
+Because \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}
+
+\pnum
\begin{note}
-The semantics of the \tcode{execution::parallel_policy} or
-the \tcode{execution::parallel_unsequenced_policy} invocation
+The semantics of invocation with
+\tcode{execution::unsequenced_policy},
+\tcode{execution::parallel_policy}, or
+\tcode{execution::parallel_unsequenced_policy}
allow the implementation to fall back to sequential execution
-if the system cannot parallelize an algorithm invocation
-due to lack of resources.
+if the system cannot parallelize an algorithm invocation,
+e.g., due to lack of resources.
\end{note}
\pnum
@@ -575,7 +609,7 @@
namespace std {
// \ref{alg.nonmodifying}, non-modifying sequence operations
- // \ref{alg.all_of}, all of
+ // \ref{alg.all.of}, all of
template
constexpr bool all_of(InputIterator first, InputIterator last, Predicate pred);
template
@@ -591,7 +625,7 @@
constexpr bool all_of(R&& r, Pred pred, Proj proj = {});
}
- // \ref{alg.any_of}, any of
+ // \ref{alg.any.of}, any of
template
constexpr bool any_of(InputIterator first, InputIterator last, Predicate pred);
template
@@ -607,7 +641,7 @@
constexpr bool any_of(R&& r, Pred pred, Proj proj = {});
}
- // \ref{alg.none_of}, none of
+ // \ref{alg.none.of}, none of
template
constexpr bool none_of(InputIterator first, InputIterator last, Predicate pred);
template
@@ -633,8 +667,20 @@
namespace ranges {
template
struct for_each_result {
- I in;
- F fun;
+ [[no_unique_address]] I in;
+ [[no_unique_address]] F fun;
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator for_each_result() const & {
+ return {in, fun};
+ }
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator for_each_result() && {
+ return {std::move(in), std::move(fun)};
+ }
};
template S, class Proj = identity,
@@ -678,10 +724,10 @@
namespace ranges {
template S, class T, class Proj = identity>
- requires IndirectRelation, projected, const T*>
+ requires IndirectRelation, const T*>
constexpr I find(I first, S last, const T& value, Proj proj = {});
template
- requires IndirectRelation, projected, Proj>, const T*>
+ requires IndirectRelation, Proj>, const T*>
constexpr safe_iterator_t
find(R&& r, const T& value, Proj proj = {});
template S, class Proj = identity,
@@ -725,13 +771,13 @@
namespace ranges {
template S1, ForwardIterator I2, Sentinel S2,
- class Pred = ranges::equal_to<>, class Proj1 = identity, class Proj2 = identity>
+ class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
requires IndirectlyComparable
constexpr subrange
find_end(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
template, class Proj1 = identity, class Proj2 = identity>
+ class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
requires IndirectlyComparable, iterator_t, Pred, Proj1, Proj2>
constexpr safe_subrange_t
find_end(R1&& r1, R2&& r2, Pred pred = {},
@@ -765,13 +811,13 @@
template S1, ForwardIterator I2, Sentinel S2,
class Proj1 = identity, class Proj2 = identity,
IndirectRelation,
- projected> Pred = ranges::equal_to<>>
+ projected> Pred = ranges::equal_to>
constexpr I1 find_first_of(I1 first1, S1 last1, I2 first2, S2 last2,
Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
template, Proj1>,
- projected, Proj2>> Pred = ranges::equal_to<>>
+ projected, Proj2>> Pred = ranges::equal_to>
constexpr safe_iterator_t
find_first_of(R1&& r1, R2&& r2,
Pred pred = {},
@@ -798,11 +844,11 @@
namespace ranges {
template S, class Proj = identity,
- IndirectRelation> Pred = ranges::equal_to<>>
+ IndirectRelation> Pred = ranges::equal_to>
constexpr I adjacent_find(I first, S last, Pred pred = {},
Proj proj = {});
template, Proj>> Pred = ranges::equal_to<>>
+ IndirectRelation, Proj>> Pred = ranges::equal_to>
constexpr safe_iterator_t
adjacent_find(R&& r, Pred pred = {}, Proj proj = {});
}
@@ -825,11 +871,11 @@
namespace ranges {
template S, class T, class Proj = identity>
- requires IndirectRelation, projected, const T*>
+ requires IndirectRelation, const T*>
constexpr iter_difference_t
count(I first, S last, const T& value, Proj proj = {});
template
- requires IndirectRelation, projected, Proj>, const T*>
+ requires IndirectRelation, Proj>, const T*>
constexpr iter_difference_t>
count(R&& r, const T& value, Proj proj = {});
template S, class Proj = identity,
@@ -887,21 +933,33 @@
namespace ranges {
template
struct mismatch_result {
- I1 in1;
- I2 in2;
+ [[no_unique_address]] I1 in1;
+ [[no_unique_address]] I2 in2;
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator mismatch_result() const & {
+ return {in1, in2};
+ }
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator mismatch_result() && {
+ return {std::move(in1), std::move(in2)};
+ }
};
template S1, InputIterator I2, Sentinel S2,
class Proj1 = identity, class Proj2 = identity,
IndirectRelation,
- projected> Pred = ranges::equal_to<>>
+ projected> Pred = ranges::equal_to>
constexpr mismatch_result
mismatch(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
template, Proj1>,
- projected, Proj2>> Pred = ranges::equal_to<>>
+ projected, Proj2>> Pred = ranges::equal_to>
constexpr mismatch_result, safe_iterator_t>
mismatch(R1&& r1, R2&& r2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
@@ -943,19 +1001,19 @@
namespace ranges {
template S1, InputIterator I2, Sentinel S2,
- class Pred = ranges::equal_to<>, class Proj1 = identity, class Proj2 = identity>
+ class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
requires IndirectlyComparable
constexpr bool equal(I1 first1, S1 last1, I2 first2, S2 last2,
Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
- template,
+ template
requires IndirectlyComparable, iterator_t, Pred, Proj1, Proj2>
constexpr bool equal(R1&& r1, R2&& r2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
}
- // \ref{alg.is_permutation}, is permutation
+ // \ref{alg.is.permutation}, is permutation
template
constexpr bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2);
@@ -972,13 +1030,13 @@
namespace ranges {
template S1, ForwardIterator I2,
- Sentinel S2, class Pred = ranges::equal_to<>, class Proj1 = identity,
+ Sentinel S2, class Pred = ranges::equal_to, class Proj1 = identity,
class Proj2 = identity>
requires IndirectlyComparable
constexpr bool is_permutation(I1 first1, S1 last1, I2 first2, S2 last2,
Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
- template,
+ template
requires IndirectlyComparable, iterator_t, Pred, Proj1, Proj2>
constexpr bool is_permutation(R1&& r1, R2&& r2, Pred pred = {},
@@ -1010,13 +1068,13 @@
namespace ranges {
template S1, ForwardIterator I2,
- Sentinel S2, class Pred = ranges::equal_to<>,
+ Sentinel S2, class Pred = ranges::equal_to,
class Proj1 = identity, class Proj2 = identity>
requires IndirectlyComparable
constexpr subrange
search(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
- template,
+ template
requires IndirectlyComparable, iterator_t, Pred, Proj1, Proj2>
constexpr safe_subrange_t
@@ -1048,12 +1106,12 @@
namespace ranges {
template S, class T,
- class Pred = ranges::equal_to<>, class Proj = identity>
+ class Pred = ranges::equal_to, class Proj = identity>
requires IndirectlyComparable
constexpr subrange
search_n(I first, S last, iter_difference_t count,
const T& value, Pred pred = {}, Proj proj = {});
- template,
+ template
requires IndirectlyComparable, const T*, Pred, Proj>
constexpr safe_subrange_t
@@ -1078,8 +1136,20 @@
namespace ranges {
template
struct copy_result {
- I in;
- O out;
+ [[no_unique_address]] I in;
+ [[no_unique_address]] O out;
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator copy_result() const & {
+ return {in, out};
+ }
+
+ template
+ requires ConvertibleTo && ConvertibleTo
+ operator copy_result() && {
+ return {std::move(in), std::move(out)};
+ }
};
template S, WeaklyIncrementable O>
@@ -1266,9 +1336,23 @@
template
struct binary_transform_result {
- I1 in1;
- I2 in2;
- O out;
+ [[no_unique_address]] I1 in1;
+ [[no_unique_address]] I2 in2;
+ [[no_unique_address]] O out;
+
+ template
+ requires ConvertibleTo &&
+ ConvertibleTo && ConvertibleTo
+ operator binary_transform_result() const & {
+ return {in1, in2, out};
+ }
+
+ template
+ requires ConvertibleTo &&
+ ConvertibleTo && ConvertibleTo
+ operator binary_transform_result() && {
+ return {std::move(in1), std::move(in2), std::move(out)};
+ }
};
template S1, InputIterator I2, Sentinel S2,
@@ -1307,12 +1391,12 @@
namespace ranges {
template S, class T1, class T2, class Proj = identity>
requires Writable &&
- IndirectRelation, projected, const T1*>
+ IndirectRelation, const T1*>
constexpr I
replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {});
template
requires Writable, const T2&> &&
- IndirectRelation, projected, Proj>, const T1*>
+ IndirectRelation, Proj>, const T1*>
constexpr safe_iterator_t
replace(R&& r, const T1& old_value, const T2& new_value, Proj proj = {});
template S, class T, class Proj = identity,
@@ -1353,14 +1437,14 @@
template S, class T1, class T2, OutputIterator O,
class Proj = identity>
requires IndirectlyCopyable &&
- IndirectRelation, projected, const T1*>
+ IndirectRelation, const T1*>
constexpr replace_copy_result
replace_copy(I first, S last, O result, const T1& old_value, const T2& new_value,
Proj proj = {});
template O,
class Proj = identity>
requires IndirectlyCopyable, O> &&
- IndirectRelation, projected, Proj>, const T1*>
+ IndirectRelation, Proj>, const T1*>
constexpr replace_copy_result, O>
replace_copy(R&& r, O result, const T1& old_value, const T2& new_value,
Proj proj = {});
@@ -1448,11 +1532,11 @@
namespace ranges {
template S, class T, class Proj = identity>
- requires IndirectRelation, projected, const T*>
+ requires IndirectRelation, const T*>
constexpr I remove(I first, S last, const T& value, Proj proj = {});
template
requires Permutable> &&
- IndirectRelation, projected, Proj>, const T*>
+ IndirectRelation, Proj>, const T*>
constexpr safe_iterator_t
remove(R&& r, const T& value, Proj proj = {});
template S, class Proj = identity,
@@ -1493,12 +1577,12 @@
template S, WeaklyIncrementable O, class T,
class Proj = identity>
requires IndirectlyCopyable &&
- IndirectRelation, projected, const T*>
+ IndirectRelation, const T*>
constexpr remove_copy_result
remove_copy(I first, S last, O result, const T& value, Proj proj = {});
template
requires IndirectlyCopyable, O> &&
- IndirectRelation, projected, Proj>, const T*>
+ IndirectRelation, Proj>, const T*>
constexpr remove_copy_result, O>
remove_copy(R&& r, O result, const T& value, Proj proj = {});
@@ -1533,10 +1617,10 @@
namespace ranges {
template S, class Proj = identity,
- IndirectRelation> C = ranges::equal_to<>>
+ IndirectRelation> C = ranges::equal_to>
constexpr I unique(I first, S last, C comp = {}, Proj proj = {});
template, Proj>> C = ranges::equal_to<>>
+ IndirectRelation, Proj>> C = ranges::equal_to>
requires Permutable