簡體   English   中英

引用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。 存在從boolstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM