gpt4 book ai didi

c++ - 引用 std::atomic 的已删除函数错误

转载 作者:行者123 更新时间:2023-11-28 04:20:26 26 4
gpt4 key购买 nike

我有一个 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() 函数上遇到以下错误。

Error C2280 'std::atomic::atomic(const std::atomic &)': attempting to reference a deleted function

我知道发生这种情况是因为原子的复制构造函数被删除了。但是我关注了this answer并定义了复制构造函数。我不知道为什么错误仍然出现。我也试过:

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

但还是报错。

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

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

现在这更令人困惑了。

编辑 2:

经过更多的故障排除后,我发现问题可能出在返回类型上。在三元 if 条件 exp1 中? exp2 : exp3,返回类型是 exp2 的类型(解释为 here )。所以在这种情况下,B::getBool() 的返回类型变成atomic_bool,而不是atomic。当我将 static_cast 添加到以下代码时,我不再收到错误。

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

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

最佳答案

你的条件表达式

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

不应该编译。但是,其原因与 std::atomic<bool> 的复制构造函数无关。 .此条件切换之间的两个表达式首先是类类型 std::atomic<bool> 的左值其次,非类类型的纯右值 bool .存在来自 bool 的隐式转换序列至 std::atomic<bool> .还存在来自 std::atomic<bool> 的隐式转换序列至 bool .基于[expr.cond]/4 , 因此这个程序应该是病式的。

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

正如您已经了解的那样,使用 aObj.load()得到它的bool值,显式转换 aObj.isTruebool ,或用 if 替换条件表达式声明将解决问题......

关于c++ - 引用 std::atomic<bool> 的已删除函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55565412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com