簡體   English   中英

完美轉發構造函數和已刪除的構造函數

[英]Perfect forwarding constructor and deleted constructors

正如邁克爾·帕克指出的那樣如果我們不想以錯誤的構造函數結束,那么添加完美的轉發構造函數可能會非常棘手。

目前我有一個使用完美轉發構造函數的A類,因此,我需要明確聲明4個構造函數: A&const A&A&&const A&&

class A
{
public:
    template<typename T> A(T&&);
    A(A&);
    A(const A&);
    A(A&&);
    A(const A&&);
};

我想禁止使用const引用rvalue構造函數,所以我正在考慮刪除它:

class A
{
public:
    template<typename T> A(T&&);
    A(A&);
    A(const A&);
    A(A&&);
    A(const A&&) = delete;
};

看起來它到目前為止有效 但我只是看一個實際的樣本,我想要更好的確認,例如來自C ++標准。

完美的轉發構造函數是否有可能接管已刪除的構造函數? 畢竟,通用引用T&&const A&&兼容。

完美轉發構造函數通常更適合非常量左值

完美的轉發構造函數是否有可能接管已刪除的構造函數?

編號A(const A&&)是一個完美匹配,它被明確刪除,因此,如果我們嘗試從const左值引用構造A ,則編譯時錯誤被激活。

然而你可以做類似這樣的template<typename T, typename = typename std::enable_if<!std::is_same_v<A&&, T>> A(T&&); 同樣。

PS explicit標記構造explicit是一種很好的做法(特別是在發生類型推導時)。

暫無
暫無

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

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