std::atomic<T>::operator= 是如何为不可变类型实现的?

How is std::atomic<T>::operator= implemented for immutable types?

我了解到线程间通信的一种方式是共享一些原子数据结构。例如:

struct Point {
    int const x, y;
};

std::atomic<Point> some_point_in_shared_memory{Point{0, 0}};

尽管 Point::operator=(Point const &) 被删除,但似乎 no problem 调用了 std::atomic<Point> 的赋值运算符,如下所示:

some_point_in_shared_memory = Point{1, 2};

如何实现这个操作?

我可能想到的一个解决方案是使用 placement new 在旧对象之上构造一个新对象,但显然 it is not exception safe。还是因为 Point 是可平凡复制的?

来自cppreference

The primary std::atomic template may be instantiated with any TriviallyCopyable type T satisfying both CopyConstructible and CopyAssignable. The program is ill-formed if any of following values is false:

std::is_trivially_copyable<T>::value
std::is_copy_constructible<T>::value
std::is_move_constructible<T>::value
std::is_copy_assignable<T>::value
std::is_move_assignable<T>::value

你的T不是CopyAssignable,这一行

some_point_in_shared_memory = Point{1, 2};

是ill-formed。应该有编译错误。不幸的是,我没有让 GCC 发出错误或警告(-pedantic -Wpedantic -pedantic-errors -Wall -Werror=pedantic 无效)。