[英]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.