c++0x 中原子变量的初始化

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

c++0x中的原子变量可以全局初始化吗?

例如

atomic_int turnX = 5;
int main(){
    ....
}

失败了 错误:删除了函数‘std::atomic::atomic(const std::atomic&)’

查看atomic_2.h确实给出了这样的想法:这是不允许的。我关于原子变量只能从函数内部赋值的说法正确吗?

c++11 initialization atomic
2个回答
6
投票

尝试:

atomic_int turnX(5);

这是一个 constexpr 构造函数,因此应将其构造为常量初始化(即在加载时)。


0
投票

是的。顺便说一句,你的代码从 C++17 开始就可以工作。

std::atomic 不可复制或移动。

在 C++17 之前,复制初始化

std::atomic<int> turnX = 5;
将首先从 5 构造一个临时
std::atomic<int>
,然后从该临时值直接初始化turnX。如果没有移动或复制构造函数,这将失败,因此该行无法编译。然而,
std::atomic<int> turnX (5);
std::atomic<int> turnX {5};
是直接初始化,并且只会使用构造函数的参数5构造turnX。

自 C++17 起,没有临时变量,在任何情况下,turnX 都将直接由以 5 作为参数的构造函数调用来初始化,因此 std::atomic 不可移动不存在问题。

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