845. atomics cannot support aggregate initialization

Section: 32.5.8 [atomics.types.generic] Status: CD1 Submitter: Alisdair Meredith Opened: 2008-06-03 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [atomics.types.generic].

View all issues with CD1 status.

Discussion:

The atomic classes (and class templates) are required to support aggregate initialization (99 [atomics.types.integral] p. 2 / 99 [atomics.types.address] p. 1) yet also have user declared constructors, so cannot be aggregates.

This problem might be solved with the introduction of the proposed initialization syntax at Antipolis, but the wording above should be altered. Either strike the sentence as redundant with new syntax, or refer to 'brace initialization'.

[ Jens adds: ]

Note that

atomic_itype a1 = { 5 };

would be aggregate-initialization syntax (now coming under the disguise of brace initialization), but would be ill-formed, because the corresponding constructor for atomic_itype is explicit. This works, though:

atomic_itype a2 { 6 };

[ San Francisco: ]

The preferred approach to resolving this is to remove the explicit specifiers from the atomic integral type constructors.

Lawrence will provide wording.

This issue is addressed in N2783.

Proposed resolution:

within the synopsis in 99 [atomics.types.integral] edit as follows.


....
typedef struct atomic_bool {
....
  constexpr explicit atomic_bool(bool);
....
typedef struct atomic_itype {
....
  constexpr explicit atomic_itype(integral);
....

edit 99 [atomics.types.integral] paragraph 2 as follows.

The atomic integral types shall have standard layout. They shall each have a trivial default constructor, a constexpr explicit value constructor, a deleted copy constructor, a deleted copy assignment operator, and a trivial destructor. They shall each support aggregate initialization syntax.

within the synopsis of 99 [atomics.types.address] edit as follows.


....
typedef struct atomic_address {
....
  constexpr explicit atomic_address(void*);
....

edit 99 [atomics.types.address] paragraph 1 as follows.

The type atomic_address shall have standard layout. It shall have a trivial default constructor, a constexpr explicit value constructor, a deleted copy constructor, a deleted copy assignment operator, and a trivial destructor. It shall support aggregate initialization syntax.

within the synopsis of 32.5.8 [atomics.types.generic] edit as follows.


....
template <class T> struct atomic {
....
  constexpr explicit atomic(T);
....
template <> struct atomic<integral> : atomic_itype {
....
  constexpr explicit atomic(integral);
....
template <> struct atomic<T*> : atomic_address {
....
  constexpr explicit atomic(T*);
....

edit 32.5.8 [atomics.types.generic] paragraph 2 as follows.

Specializations of the atomic template shall have a deleted copy constructor, a deleted copy assignment operator, and a constexpr explicit value constructor.