以下代码打印
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
但是在 MSVC 上的结果是:
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),我不知道查看此案例的任何要求。
另请参阅:删除了复制构造函数的类是否可以轻松复制?
删除的构造函数并非不重要。
在 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