This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.
1322. ExplicitCopyConstructible
requirements are insufficient
Section: 16.4.4.2 [utility.arg.requirements] Status: Resolved Submitter: Daniel Krügler Opened: 2010-02-16 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [utility.arg.requirements].
View all issues with Resolved status.
Discussion:
With the acceptance of library defect 822(i) only direct-initialization is supported, and not copy-initialization in the requirement sets MoveConstructible
and CopyConstructible
. This is usually a good thing, if only the library implementation needs to obey these restrictions, but the Empire strikes back quickly:
Affects user-code: std::exception_ptr
is defined purely via requirements, among them CopyConstructible
. A strict reading of the standard would make implementations conforming where std::exception_ptr
has an explicit copy-c'tor and user-code must code defensively. This is a very unwanted effect for such an important component like std::exception_ptr
.
Wrong re-use: Recently proposed requirement sets (NullablePointer
as of N3025, Hash) or cleanup of existing requirement sets (e.g. iterator requirements as of N3046) tend to reuse existing requirement sets, so reusing CopyConstructible
is attempting, even in cases, where the intend is to support copy-initialization as well.
Inconsistency: The current iterator requirements set Table 102 (output iterator requirements) and Table 103 (forward iterator requirements) demonstrate quite clearly a strong divergence of copy-semantics: The specified semantics of
X u(a); X u = a;
are underspecified compared to the most recent clarifications of the CopyConstructible
requirements, c.f. issue 1309(i) which is very unsatisfactory. This will become worse for each further issue that involves the CopyConstructible
specification (for possible directions see 1173(i)).
The suggested resolution is to define two further requirements implicit-MoveConstructible
and implicit-CopyConstructible
(or any other reasonable name like MoveConvertible
and CopyConvertible
) each with a very succinct but precise meaning solving all three problems mentioned above.
[Batavia: Resolved by accepting n3215.]
Proposed resolution:
Add the following new table ?? after Table 34 — MoveConstructible
requirements [moveconstructible]:
Table ?? —Implicit MoveConstructible
requirements [implicit.moveconstructible] (in addition toMoveConstructible
) Expression Operational SemanticsT u = rv;
Equivalent to:T u(rv);
Add the following new table ?? after Table 35 — CopyConstructible
requirements [copyconstructible]:
Table ?? —Implicit CopyConstructible
requirements [implicit.copyconstructible] (in addition toCopyConstructible
) Expression Operational SemanticsT u = v;
Equivalent to:T u(v);
Change 16.4.4.4 [nullablepointer.requirements]/1 as follows:
A
NullablePointer
type is a pointer-like type that supports null values. A typeP
meets the requirements ofNullablePointer
if:
P
satisfies the requirements ofEqualityComparable
,DefaultConstructible
,implicit CopyConstructible
,CopyAssignable
, andDestructible
,- [..]
Change 16.4.4.5 [hash.requirements]/1 as indicated: [explicit copy-constructible functors could not be provided as arguments to any algorithm that takes these by value. Also a typo is fixed.]
1 A type
H
meets the Hash requirements if:
- it is a function object type (20.8),
- it satis fies ifes the requirements of
implicit CopyConstructible
andDestructible
(20.2.1),- [..]
Change 21.3.2 [meta.rqmts]/1+2 as indicated:
1 A UnaryTypeTrait describes a property of a type. It shall be a class template that takes one template type argument and, optionally, additional arguments that help define the property being described. It shall be
DefaultConstructible
,implicit CopyConstructible
, [..]2 A
BinaryTypeTrait
describes a relationship between two types. It shall be a class template that takes two template type arguments and, optionally, additional arguments that help define the relationship being described. It shall beDefaultConstructible
,implicitCopyConstructible
, and [..]
Change 22.10.4 [func.require]/4 as indicated: [explicit copy-constructible functors could not be provided as arguments to any algorithm that takes these by value]
4 Every call wrapper (20.8.1) shall be
implicit MoveConstructible
. A simple call wrapper is a call wrapper that isimplicit CopyConstructible
andCopyAssignable
and whose copy constructor, move constructor, and assignment operator do not throw exceptions. [..]
Change 22.10.6 [refwrap]/1 as indicated:
1
reference_wrapper<T>
is a nimplicit
CopyConstructible
andCopyAssignable
wrapper around a reference to an object or function of typeT
.
Change 22.10.15.4 [func.bind.bind]/5+9 as indicated:
5 Remarks: The return type shall satisfy the requirements of
implicit MoveConstructible
. If all ofFD
andTiD
satisfy the requirements ofCopyConstructible
, then the return type shall satisfy the requirements ofimplicit CopyConstructible
. [Note: this implies that all ofFD
andTiD
areMoveConstructible
. — end note][..]
9 Remarks: The return type shall satisfy the requirements of
implicit MoveConstructible
. If all ofFD
andTiD
satisfy the requirements ofCopyConstructible
, then the return type shall satisfy the requirements ofimplicit CopyConstructible
. [Note: this implies that all ofFD
andTiD
areMoveConstructible
. — end note]
Change 22.10.15.5 [func.bind.place] as indicated:
1 All placeholder types shall be
DefaultConstructible
andimplicit CopyConstructible
, and [..]
Change 20.3.1 [unique.ptr]/5 as indicated:
5 Each object of a type
U
instantiated form theunique_ptr
template specified in this subclause has the strict ownership semantics, specified above, of a unique pointer. In partial satisfaction of these semantics, each suchU
isimplicit MoveConstructible
andMoveAssignable
, but is notCopyConstructible
norCopyAssignable
. The template parameterT
ofunique_ptr
may be an incomplete type.
Change 20.3.2.2 [util.smartptr.shared]/2 as indicated:
2 Specializations of
shared_ptr
shall beimplicit CopyConstructible
,CopyAssignable
, andLessThanComparable
, [..]
Change 20.3.2.3 [util.smartptr.weak]/2 as indicated:
2 Specializations of
weak_ptr
shall beimplicit CopyConstructible
andCopyAssignable
, allowing their use in standard containers. The template parameterT
ofweak_ptr
may be an incomplete type.
Change 24.3.5.2 [iterator.iterators]/2 as indicated: [This fixes a defect in the Iterator requirements. None of the usual algorithms accepting iterators would be usable with iterators with explicit copy-constructors]
2 A type
X
satisfies the Iterator requirements if:
X
satisfies theimplicit CopyConstructible
,CopyAssignable
, andDestructible
requirements (20.2.1) and lvalues of typeX
are swappable (20.2.2), and [..]- ...
Change 99 [auto.ptr]/3 as indicated:
3 [..] Instances of
auto_ptr
meet the requirements ofimplicit MoveConstructible
andMoveAssignable
, but do not meet the requirements ofCopyConstructible
andCopyAssignable
. — end note]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4