std::atomic<std::optional<std::chrono::time_point<std::chrono::system_clock>>>是否有效/安全?
根据std::atomic<std::string> 工作正常吗?,std::atomic<std::string>无效并可能导致未定义的行为。
怎么样std::atomic<std::optional<std::chrono::time_point<std::chrono::system_clock>>>?
std::optional有operator=但std::chrono::time_point没有,所以我很困惑。我如何确定任何类型?
回答
检查很简单:
static_assert(std::is_trivially_copyable_v<
std::optional<std::chrono::time_point<std::chrono::system_clock>>>);
在 gcc 8.1(以及相关的 libstdc++)之前,断言失败,因此使用不安全。在 gcc 8.1 之后断言通过所以它是安全的。
在 clang 7(以及相关的 libc++)之前,断言失败,因此使用不安全。在 clang 7 之后断言通过并且是安全的。
回答
正如链接线程中提到的,std::atomic<T>需要T可以简单地复制。
这T是std::optional<U>一些U。在std::optional类模板前锋琐事:如果同样是平凡的它的拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值操作符和析构函数是每个微不足道U。
没有std::chrono::time_point<std::chrono::system_clock>可简单复制的铁定保证。的底层表示time_point可能是算术类型或“模拟算术类型的类”([time.duration]/2),我认为它足够灵活以允许例如非平凡的复制构造函数(即使它们具有相同的语义)作为一个简单的复制构造函数)。如果是这种情况,time_point将无法简单地复制。
在任何情况下,std::atomic<std::optional<std::chrono::time_point<std::chrono::system_clock>>>是可以放心使用,如果它编译。如果Tinstd::atomic<T>不可简单复制,编译器必须发出诊断信息,因为如果不满足此条件([atomics.types.generic]/1),标准会说“程序格式错误”。在该标准的早期版本中,措辞是“......应该可以简单地复制”,这也是一个可诊断的规则,因为它没有说“否则行为未定义”或任何类似的东西。