Hello,

On 11/10/2024 21:43, Jonathan Wakely wrote:

Or alternatively, and arguably simpler, we could get rid of the ugly
_GLIBCXX20_INIT macro and just do this:
+#if __cpp_lib_atomic_value_initialization
+      atomic() noexcept (is_nothrow_default_constructible_v<_Tp>)
+      requires (is_default_constructible_v<_Tp>)
+      : _M_i() { }
+#else
       atomic() = default;
+#endif
       ~atomic() noexcept = default;
       atomic(const atomic&) = delete;
       atomic& operator=(const atomic&) = delete;

This is now basically my original patch :) but it does correctly not value-initialize _M_i in pre-C++20 modes -- my bad, I didn't realize that P0883R2 was *not* meant to be treated as a DR and backported.


This more closely matches what's in the standard, except that we have
a requires-clause on the default constructor. It seems like a defect
that the standard doesn't do this, instead requiring
is_constructible<atomic<NDC>> to be true, but Mandating an error if
you try to use it.


Did you mean is_default_constructible? Yes, the core of the "problem" seems to be the Mandates instead of the Constraints used to describe atomic()'s default constructor in https://eel.is/c++draft/atomics.types.operations#1 . I also think a constraint would be more natural, in line with the idea of atomic<T> "wrapping" a T object. I don't seem to find any rationale for this choice in P0883's revisions, I guess I'll just ask SG1 and/or possibly submit a LWG issue.


Thank you again for the review,
--
Giuseppe D'Angelo

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to