引用 std::atomic <bool>的已删除函数错误

Referencing a deleted function error for std::atomic<bool>

本文关键字:删除 函数 错误 gt std lt 引用 bool atomic      更新时间:2023-10-16

我有一个std:atomic_bool,我在代码中定义如下:

class A
{
public:
A();
A(const A&);
~A();
std::atomic_bool isTrue;
}
A:A()
{
isTrue= false;
}
A::A(const A&) : isTrue(false)
{}

然后我执行以下操作:

class B
{
A aObj;
public:
bool getBool()
{
return GetNumberOfUsers() > 1 ? aObj.isTrue : true;
}

我在getBool()函数上收到以下错误。

错误 C2280 'std::atomic::atomic(const std::atomic &)': 尝试引用已删除的函数

我知道发生这种情况是因为删除了原子的复制构造函数。但是我已经遵循了这个答案并定义了复制构造函数。 我不知为什么错误仍然出现。 我也试过:

class A
{
...  
A(const A&) = delete;

但仍然得到错误。

编辑: 经过一些故障排除,我遇到了一种奇怪的行为。 我发现如果我在 B::getBool() 中更改我的三元,如果条件如下,我不会收到错误。

bool getBool()
{
// return GetNumberOfUsers() > 1 ? aObj.isTrue : true;
if (GetNumberOfUsers() > 1)
return aObj.isTrue ;
else
return true;
}

现在这更加令人困惑。

编辑2:

经过更多的故障排除,我发现问题可能是返回类型。 在三元 if 条件exp1 ? exp2 : exp3中,返回类型是 exp2 的类型(如此处所述)。 因此,在这种情况下,返回类型 B::getBool() 变为atomic_bool,而不是原子。 当我将代码static_cast添加到以下内容时,我不再收到错误。

bool getBool()
{
return GetNumberOfUsers() > 1 ? static_cast<bool>(aObj.isTrue) : true;
}

但是我仍然不知道为什么这会抛出复制构造函数错误。 谢谢。

U 条件表达式

GetNumberOfUsers() > 1 ? aObj.isTrue : true;

不应编译。但是,其原因与std::atomic<bool>的复制构造函数无关。此条件切换的两个表达式是:第一个是类类型std::atomic<bool>的左值,第二个是非类类型bool的 prvalue 。存在从boolstd::atomic<bool>的隐式转换序列。还存在从std::atomic<bool>bool的隐式转换序列。因此,基于 [expr.cond]/4,该程序的格式应该不正确。

我相信 MSVC 显然试图使此表达式导致std::atomic<bool>这一事实一定是 MSVC 中的一个错误。请注意,当前版本的 MSVC 在切换到一致性模式(通过/permissive-选项;如果可以的话,每个人都应该使用它)时,将与其他编译器达成一致,正确诊断问题。现场演示在这里

正如您自己已经了解到的那样,使用aObj.load()获取其bool值,将aObj.isTrue显式转换为bool,或将条件表达式替换为if语句将解决问题......