考虑以下最小工作示例:
他们为什么要尝试复制一个
#include <atomic>
int main() {
::std::atomic<bool> a = false;
}
原子类型的拷贝构造函数和拷贝赋值函数均被明确禁用。然而,这应该调用接受布尔类型参数的构造函数。
g++和clang++都指出该行代码试图调用atomic
的拷贝构造函数:
$ g++ -std=c++1z a.cpp
a.cpp: In function ‘int main()’:
a.cpp:4:27: error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’
::std::atomic<bool> a = false;
^~~~~
$ clang++ -std=c++1z a.cpp
a.cpp:4:23: error: copying variable of type '::std::atomic<bool>' invokes deleted constructor
::std::atomic<bool> a = false;
^ ~~~~~
他们为什么要尝试复制一个
原子
?
::std::atomic<bool> a = ::std::atomic<bool>(false);
,它创建了一个新的 std::atomic<bool>(false),然后进行复制。但是当像这样做::std::atomic<bool> a ( false );
时,就可以工作了。编译器能够保证复制省略吗?我认为C++17保证了它。 - user9335240