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.
CopyConstructible requirements are insufficientSection: 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 other active issues in [utility.arg.requirements].
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 MoveConstructiblerequirements [implicit.moveconstructible] (in addition toMoveConstructible)Expression Operational Semantics T u = rv;Equivalent to: T u(rv);
Add the following new table ?? after Table 35 — CopyConstructible
requirements [copyconstructible]:
Table ?? — Implicit CopyConstructiblerequirements [implicit.copyconstructible] (in addition toCopyConstructible)Expression Operational Semantics T u = v;Equivalent to: T u(v);
Change 16.4.4.4 [nullablepointer.requirements]/1 as follows:
A
NullablePointertype is a pointer-like type that supports null values. A typePmeets the requirements ofNullablePointerif:
Psatisfies 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
Hmeets the Hash requirements if:
- it is a function object type (20.8),
- it satisfies
ifesthe requirements ofimplicit CopyConstructibleandDestructible(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
BinaryTypeTraitdescribes 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,implicit CopyConstructible, 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 CopyConstructibleandCopyAssignableand 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 animplicitCopyConstructibleandCopyAssignablewrapper 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 ofFDandTiDsatisfy the requirements ofCopyConstructible, then the return type shall satisfy the requirements ofimplicit CopyConstructible. [Note: this implies that all ofFDandTiDareMoveConstructible. — end note][..]
9 Remarks: The return type shall satisfy the requirements of
implicit MoveConstructible. If all ofFDandTiDsatisfy the requirements ofCopyConstructible, then the return type shall satisfy the requirements ofimplicit CopyConstructible. [Note: this implies that all ofFDandTiDareMoveConstructible. — end note]
Change 22.10.15.5 [func.bind.place] as indicated:
1 All placeholder types shall be
DefaultConstructibleandimplicit CopyConstructible, and [..]
Change 20.3.1 [unique.ptr]/5 as indicated:
5 Each object of a type
Uinstantiated form theunique_ptrtemplate specified in this subclause has the strict ownership semantics, specified above, of a unique pointer. In partial satisfaction of these semantics, each suchUisimplicit MoveConstructibleandMoveAssignable, but is notCopyConstructiblenorCopyAssignable. The template parameterTofunique_ptrmay be an incomplete type.
Change 20.3.2.2 [util.smartptr.shared]/2 as indicated:
2 Specializations of
shared_ptrshall beimplicit CopyConstructible,CopyAssignable, andLessThanComparable, [..]
Change 20.3.2.3 [util.smartptr.weak]/2 as indicated:
2 Specializations of
weak_ptrshall beimplicit CopyConstructibleandCopyAssignable, allowing their use in standard containers. The template parameterTofweak_ptrmay 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
Xsatisfies the Iterator requirements if:
Xsatisfies theimplicit CopyConstructible,CopyAssignable, andDestructiblerequirements (20.2.1) and lvalues of typeXare swappable (20.2.2), and [..]- ...
Change 99 [auto.ptr]/3 as indicated:
3 [..] Instances of
auto_ptrmeet the requirements ofimplicit MoveConstructibleandMoveAssignable, but do not meet the requirements ofCopyConstructibleandCopyAssignable. — end note]