簡體   English   中英

C ++ 17類模板推論

[英]C++17 class template deduction

我正在嘗試在C ++ 17中的類模板演繹下。
我編寫了一個示例類模板,無需指定模板類型即可構建它。 如果不指定類型,則無法構造std::unique_ptr
我需要幫助來了解為什么會這樣。

使用clang 5.0編譯的代碼

// Please don't worry about memory leaks, etc. This is sample code anyways.
template<typename T, typename deleter = std::default_delete<T>>
struct Sample
{
T* x_;
deleter func_;

Sample(T* x = nullptr, deleter func = deleter{})
: x_(x)
, func_(func)
{
}
};

auto sample = Sample(new int(10));
std::cout << *(sample.x_) << '\n';

以下代碼無法編譯。

auto ptr = std::unique_ptr(new int(10)); 

類模板std::unique_ptr比您的玩具示例更復雜。 其主要的所有權獲取構造函數采用以下形式

unique_ptr<T, D>::unique_ptr(pointer p)

其中pointerD::pointerremove_reference_t<D>::pointerT* 因此,如果您想從構造函數中推斷出類模板參數,則首先需要知道哪個刪除程序提供了指針類型,這導致了循環依賴,因此您無法從構造函數參數中知道TD應該是什么。 為避免任何意外的誤解,標准明確要求此構造函數不得用於模板自變量推導(感謝@TC指出確切的用詞!)。

一個簡單的示例是,對於類型為U*的參數,您可以推導出unique_ptr<U>unique_ptr<U[]> 兩者顯然都不是更好,錯誤的選擇將是一場災難。

長話短說, std::unique_ptr的類模板參數不能從構造函數參數中推導,這與Sample情況不同。

暫無
暫無

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

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