引用 std::atomic <bool>的已删除函数错误
Referencing a deleted function error for std::atomic<bool>
我有一个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 。存在从bool
到std::atomic<bool>
的隐式转换序列。还存在从std::atomic<bool>
到bool
的隐式转换序列。因此,基于 [expr.cond]/4,该程序的格式应该不正确。
我相信 MSVC 显然试图使此表达式导致std::atomic<bool>
这一事实一定是 MSVC 中的一个错误。请注意,当前版本的 MSVC 在切换到一致性模式(通过/permissive-
选项;如果可以的话,每个人都应该使用它)时,将与其他编译器达成一致,正确诊断问题。现场演示在这里
正如您自己已经了解到的那样,使用aObj.load()
获取其bool
值,将aObj.isTrue
显式转换为bool
,或将条件表达式替换为if
语句将解决问题......
- 为什么我的双向链表删除函数会删除多个节点?
- unique_ptr实现接口时对已删除函数的引用
- 可视代码 删除函数括号内的空格
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 试图引用已删除函数数组的相等运算符
- 双链表堆栈删除函数不起作用
- 是否需要删除函数中未使用的新结构?
- C++引用已删除函数错误
- 删除函数环境中C++输入 R 对象
- 删除函数中的对象C++
- 在 C++ 中使用删除函数的不同方式
- C++错误:C2280 - 引用已删除函数的编译器错误?
- C++,删除函数/迭代进程中定义的动态数组
- 删除函数 c++ 的读取访问冲突异常
- 如何对此自定义C 列表类实现删除函数
- 双向链表问题(特别是复制构造函数和删除函数)
- 引用 std::atomic <bool>的已删除函数错误
- 在删除函数自由度的指针后,为什么我会得到核心转储
- C++删除函数
- 返回 C++11 中已删除函数的类型