<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 845: atomics cannot support aggregate initialization</title>
<meta property="og:title" content="Issue 845: atomics cannot support aggregate initialization">
<meta property="og:description" content="C++ library issue. Status: CD1">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue845.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#CD1">CD1</a> status.</em></p>
<h3 id="845"><a href="lwg-defects.html#845">845</a>. atomics cannot support aggregate initialization</h3>
<p><b>Section:</b> 32.5.8 <a href="https://wg21.link/atomics.types.generic">[atomics.types.generic]</a> <b>Status:</b> <a href="lwg-active.html#CD1">CD1</a>
 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2008-06-03 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#atomics.types.generic">issues</a> in [atomics.types.generic].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#CD1">CD1</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The atomic classes (and class templates) are required to support aggregate
initialization (99 [atomics.types.integral] p. 2 &#47; 99 [atomics.types.address] p. 1)
yet also have user declared constructors, so cannot be aggregates.
</p>
<p>
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'.
</p>

<p><i>[
Jens adds:
]</i></p>


<blockquote>
<p>
Note that
</p>
<blockquote><pre>
atomic_itype a1 = { 5 };
</pre></blockquote>
<p>
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:
</p>
<blockquote><pre>
atomic_itype a2 { 6 };
</pre></blockquote>

</blockquote>

<p><i>[
San Francisco:
]</i></p>


<blockquote>
<p>
The preferred approach to resolving this is to remove the explicit
specifiers from the atomic integral type constructors.
</p>
<p>
Lawrence will provide wording.
</p>
<p>
This issue is addressed in
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2783.htm">N2783</a>.
</p>
</blockquote>



<p id="res-845"><b>Proposed resolution:</b></p>
<p>
within the synopsis in 99 [atomics.types.integral] edit as follows.
</p>

<blockquote><pre><code>
....
typedef struct atomic_bool {
....
  constexpr <del>explicit</del> atomic_bool(bool);
....
typedef struct atomic_<var>itype</var> {
....
  constexpr <del>explicit</del> atomic_<var>itype</var>(<var>integral</var>);
....
</code></pre></blockquote>

<p>
edit 99 [atomics.types.integral] paragraph 2 as follows.
</p>

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

<p>
within the synopsis of 99 [atomics.types.address] edit as follows.
</p>

<blockquote><pre><code>
....
typedef struct atomic_address {
....
  constexpr <del>explicit</del> atomic_address(void*);
....
</code></pre></blockquote>

<p>
edit 99 [atomics.types.address] paragraph 1 as follows.
</p>

<blockquote><p>
The type <code>atomic_address</code> shall have standard layout.
It shall have a trivial default constructor,
a constexpr <del>explicit</del> value constructor,
a deleted copy constructor,
a deleted copy assignment operator,
and a trivial destructor.
It shall support aggregate initialization syntax.
</p></blockquote>

<p>
within the synopsis of 32.5.8 <a href="https://wg21.link/atomics.types.generic">[atomics.types.generic]</a> edit as follows.
</p>

<blockquote><pre><code>
....
template &lt;class T&gt; struct atomic {
....
  constexpr <del>explicit</del> atomic(T);
....
template &lt;&gt; struct atomic&lt;<var>integral</var>&gt; : atomic_<var>itype</var> {
....
  constexpr <del>explicit</del> atomic(<var>integral</var>);
....
template &lt;&gt; struct atomic&lt;T*&gt; : atomic_address {
....
  constexpr <del>explicit</del> atomic(T*);
....
</code></pre></blockquote>

<p>
edit 32.5.8 <a href="https://wg21.link/atomics.types.generic">[atomics.types.generic]</a> paragraph 2 as follows.
</p>

<blockquote><p>
Specializations of the <code>atomic</code> template
shall have a deleted copy constructor,
a deleted copy assignment operator,
and a constexpr <del>explicit</del> value constructor.
</p></blockquote>






</body>
</html>
