簡體   English   中英

與std :: unique_ptr的clang錯誤

[英]clang error with std::unique_ptr

我有一個名為IList基礎對象。 然后我有VectorList ,它繼承了IList

然后我有這樣的功能:

std::unique_ptr<IList> factory(){
    auto vlist = std::make_unique<VectorList>();
    return vlist;
}

這在gcc下編譯沒有問題,但是clang給出了以下錯誤:

test_file.cc:26:9: error: no viable conversion from 'unique_ptr<VectorList, default_delete<VectorList>>' to
      'unique_ptr<IList, default_delete<IList>>'
        return vlist;

如何正確處理這種錯誤?

看來(你的版本)Clang在這方面仍然遵循C ++ 11的行為。 在C ++ 11中,你必須在這種情況下使用std::move ,因為vlist的類型與返回類型不同,因此“返回左值時,首先嘗試將其作為rvalue”的子句沒有應用。

在C ++ 14中,解除了“相同類型所需”的限制,因此在C ++ 14中,您不應該在return語句中使用std::move 但是如果您需要使用當前工具鏈編譯代碼,只需將其添加到那里:

return std::move(vlist);

確切的C ++ 11措辭是這樣的:

12.8 / 32當滿足或將滿足復制操作的省略標准時,除了源對象是函數參數這一事實,並且要復制的對象由左值指定,重載決策選擇構造函數為首先執行復制,就好像對象是由右值指定的一樣。 ...

必須滿足復制省略(包括“相同類型”)的標准; 它們只是稍微擴展到覆蓋參數。

在C ++ 14(N4140)中,措辭更廣泛:

12.8 / 32當滿足復制/移動操作的省略標准時,但不滿足異常聲明,並且要復制的對象由左值指定, 或者當return語句中的表達式為a時(可能是括號內的) ) id-expression命名一個對象,該對象具有在最內層封閉函數或lambda-expression的body或parameter-declaration-clause聲明的自動存儲持續時間首先執行重載決策以選擇復制的構造函數,就好像指定了對象一樣通過右值。

(強調我的)

如您所見, return案例不再需要復制省略標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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