std::array
overview container requirements are incorrectSection: 23.3.3.1 [array.overview], 23.2.2 [container.requirements.general] Status: New Submitter: Nevin Liber & Christian Trott Opened: 2019-06-13 Last modified: 2022-04-24
Priority: 3
View other active issues in [array.overview].
View all other issues in [array.overview].
View all issues with New status.
Discussion:
The requirements specified in 23.3.3.1 [array.overview] p3 are incorrect; namely:
A default constructed array<T, N>
where 0 < N
has linear,
not constant complexity.
A default constructed array<T, 0>
is empty and has constant complexity.
[2019-07 Issue Prioritization]
Priority to 3 after discussion on the reflector.
Previous resolution [SUPERSEDED]:
This wording is relative to N4810.
Modify 23.2.2 [container.requirements.general], Table 62 — "Container requirements", as indicated (This table can be identified by the "section" identifier [tab:container.req] in the next working draft):
Table 62 — Container requirements Expression Return type Operational
semanticsAssertion/note
pre/post-conditionComplexity […]
X u;
Ensures: !u.empty()
forarray<T, N>
where0 < N
, and
Ensures:u.empty()
for all other standard containers.constant(Note A)X()
Ensures: !X().empty()
forarray<T, N>
where0 < N
, and
Ensures:X().empty()
for all other standard containers.constant(Note A)[…]
Those entries marked "(Note A)" or "(Note B)" have linear complexity for
array<T, N>
where0 < N
and have constant complexity for all other standard containers.Modify 23.3.3.1 [array.overview] as indicated:
-2- An
-3- Anarray
is an aggregate (9.4.2 [dcl.init.aggr]) that can be list-initialized with up toN
elements whose types are convertible toT
.array<T, 0>
satisfies all of the requirements of a container and of a reversible container (23.2 [container.requirements]). Anarray<T, N>
where0 < N
satisfies all of the requirements of a container and of a reversible container (23.2 [container.requirements]), except that a default constructedarray<T, N>
object is not empty andthatboth default construction andswap
does nothaveconstantlinear complexity. Anarray
satisfies some of the requirements of a sequence container (23.2.4 [sequence.reqmts]). Descriptions are provided here only for operations onarray
that are not described in one of these tables and for operations where there is additional semantic information.
[2022-04-24; Daniel rebases wording on N4910]
Proposed resolution:
This wording is relative to N4910.
Modify 23.2.2.2 [container.reqmts] as indicated:
X u; X u = X();[…]-10- Postconditions:
-11- Complexity:!u.empty()
forarray<T, N>
where0 < N
, andu.empty()
for all other standard containers.ConstantLinear forarray<T, N>
where0 < N
and constant for all other standard containers.X u(rv); X u = rv;[…]-15- Postconditions:
-11- Complexity: Linear foru
is equal to the value thatrv
had before this construction.array<T, N>
where0 < N
and constant for all other standard containers.a.swap(b)-45- Result:
-46- Effects: Exchanges the contents ofvoid
a
andb
. -47- Complexity: Linear forarray<T, N>
where0 < N
and constant for all other standard containers.
Modify 23.3.3.1 [array.overview] as indicated:
-2- An
-3- Anarray
is an aggregate (9.4.2 [dcl.init.aggr]) that can be list-initialized with up toN
elements whose types are convertible toT
.array<T, 0>
meets all of the requirements of a container (23.2.2.2 [container.reqmts]) and of a reversible container (23.2.2.3 [container.rev.reqmts]). Anarray<T, N>
where0 < N
meets all of the requirements of a container (23.2.2.2 [container.reqmts]) and of a reversible container (23.2.2.3 [container.rev.reqmts]), except that a default constructedarray<T, N>
object is not empty ifN > 0
and default construction, move construction, andswap
have linear complexity ifN > 0
. Anarray
meets some of the requirements of a sequence container (23.2.4 [sequence.reqmts]). Descriptions are provided here only for operations onarray
that are not described in one of these tables and for operations where there is additional semantic information.