std::atomic<X>
requires X
to be nothrow default constructibleSection: 32.5.8 [atomics.types.generic], 32.5.8.2 [atomics.types.operations] Status: Resolved Submitter: Jonathan Wakely Opened: 2012-07-19 Last modified: 2016-01-28
Priority: 4
View all other issues in [atomics.types.generic].
View all issues with Resolved status.
Discussion:
As raised in c++std-lib-32781, this fails to compile even though the default constructor is not used:
#include <atomic> struct X { X() noexcept(false) {} X(int) { } }; std::atomic<X> x(3);
This is because atomic<T>
's default constructor is declared to be non-throwing and
is explicitly-defaulted on its first declaration:
atomic() noexcept = default;
This is ill-formed if the implicitly-declared default constructor would not be non-throwing.
Possible solutions:atomic<T>
atomic<T>::atomic()
from the overload set if T
is not nothrow default constructible.
noexcept
from atomic<T>::atomic()
, allowing it to be
deduced (but the default constructor is intended to be always noexcept)
atomic<T>::atomic()
on its first declaration (but makes the default constructor
user-provided and so prevents atomic<T>
being trivial)
[2012, Portland: move to Core]
Recommend referring to core to see if the constructor noexcept
mismatch
can be resolved there. The issue is not specific to concurrency.
[2015-04-09 Daniel comments]
CWG issue 1778, which had been created in behalf of this LWG issue, has been resolved as a defect.
[2015-10, Kona]
Mark as resolved
Proposed resolution: