提问人:John 提问时间:10/8/2023 最后编辑:Jan SchultkeJohn 更新时间:10/9/2023 访问量:92
std::atomic<std::shared_ptr<Struct Demo>>是否可以安全地与 C++11 一起使用,因为上述部分专用化仅适用于 C++20?
Could std::atomic<std::shared_ptr<Struct Demo>> could be safely used with C++11 since the said partial specializations is only available with C++20?
问:
根据 cppreference 上的 std::atomic 文章,其中说(强调我的):
在标头中定义
<atomic>
template< class T > struct atomic; // (since C++11)
template< class U > struct atomic<U*>; // (since C++11)
在标头中定义
<memory>
template< class U > struct atomic<std::shared_ptr<U>>; // (since C++20)
template< class U > struct atomic<std::weak_ptr<U>>; // (since C++20)
尽管 的部分专用化仅适用于 C++20,但可以安全地用于 C++11 吗?std::shared<T>
std::atomic<std::shared_ptr<Struct Demo>>
是否有任何我应该注意的潜在问题?
答:
不,主模板要求是可简单复制的,但事实并非如此。std::atomic<T>
T
std::shared_ptr
尝试在 C++20 之前使用它将无法编译。
评论
-stdlib=libc++
-std=gnu++20
-std=c++20
-std=gnu++14
不,将违反约束,因为根据 [atomics.types.generic] p1:std::atomic<std::shared_ptr<T>>
模板参数的类型应易于复制 ([basic.types]
T
)
注意:此要求在 C++20 ([atomics.types.generic.general]) 到 LWG3012 中更加严格:atomic<T> 对于非 is_trivially_copy_constructible
T
是不可实现的,但它不适用于智能指针的部分专用化 ([util.smartptr.atomic])。
std::shared_ptr
不是轻而易举的可复制的,因此它不能与 一起使用。std::atomic
但是,std::shared_ptr<std::atomic<T>>>
只是一个 API 改进。在 C++20 之前,可以使用实用程序函数,例如 std::atomic_load(const std::shared_ptr*)。
例如:
std::shared_ptr<int> value = std::atomic_load(&my_pointer);
// or, with explicit memory order
std::shared_ptr<int> value = std::atomic_load_explicit(&my_pointer, std::memory_order_relaxed);
Смотритетакже: std::shared_ptr 和 std::atomic<std::shared_ptr> 又名 std::experimental::atomic_shared_ptr有什么区别?
评论
T
必须是微不足道的可复制的,但事实并非如此。shared_ptr
std::is_trivially_copyable<T>::value