[英]Error: use of deleted function ‘std::atomic<bool>::atomic(const 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:
經過更多的故障排除后,我發現問題可能是返回類型。 如果有條件exp1 ? exp2 : exp3
則在三元組中exp1 ? exp2 : exp3
exp1 ? exp2 : exp3
,返回類型是EXP2的類型(如解釋在這里 )。 因此,在這種情況下,B :: getBool()的返回類型變為atomic_bool,而不是atomic_bool。 當我將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
的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
語句替換條件表達式將解決此問題……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.