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

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

我有一个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&)':尝试引用已删除的函数

我知道发生这种情况是因为原子的复制构造函数被删除了。但我已经跟随this answer并定义了复制构造函数。我迷失了为什么错误仍然存​​在。我也尝试过:

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的类型(如here所述)。所以在这种情况下,B :: getBool()的返回类型变为atomic_bool,而不是原子。当我将static_cast代码添加到以下内容时,我不再得到错误。

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

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

c++ visual-c++ atomic
1个回答
1
投票

你是条件表达式

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-选项;每个人​​都应该使用它,如果可以的话),将与其他编译器一致正确诊断问题。 live demo here

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

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