std::atomic<bool>可以简单复制吗?

问题描述 投票:0回答:2

以下代码打印

std::atomic<bool>
是否可简单复制:

#include <atomic>
#include <iostream>
#include <type_traits>

int main(){
    std::cout << std::is_trivially_copyable_v<std::atomic<bool>> << "\n";
}

它在 gcc 和 clang 上给出以下结果:

1

演示 - Godbolt

但是在 MSVC 上的结果是:

0

我认为标准以任何一种方式定义了平凡的可复制性。
哪个编译器是正确的(或者是特定于实现的)?

c++ stdatomic trivially-copyable
2个回答
0
投票

问题在于 trivially_copyable 的运作方式。您实际上无法在 clang 上复制原子:

https://godbolt.org/z/dr3q3bns5

这同样适用于自定义不可复制类型。因此,唯一的问题是是否允许 trivially_copyable 对于不可复制类型返回 true。也许有人会说,由于该类型无法复制,因此它没有重要的复制操作。虽然我自己的直觉是 is 应该给出“false” - 否则你必须在某些情况下检查 is_copyable 以及 trivally_copyable 。对标准有更多了解的人可能能够回答这个问题 - 我只能说基于 Cpp-reference (https://en.cppreference.com/w/cpp/types/is_trivially_copyable),我不知道查看此案例的任何要求。


0
投票

另请参阅:删除了复制构造函数的类是否可以轻松复制?

删除的构造函数并非不重要。

CWG1734 的决议之前,要实现简单复制,所有复制/移动构造函数/赋值运算符都必须是简单的。

std::atomic<bool>
就是这样(都删了)

使用新的措辞,也必须不删除(在 C++20 中,“合格”,因为满足其约束)。

GCC 和 Clang 没有实现这一点。请参阅:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96288https://github.com/llvm/llvm-project/issues/38398

© www.soinside.com 2019 - 2024. All rights reserved.