簡體   English   中英

為什么 std::unique_ptr 不允許類型推斷?

[英]Why does std::unique_ptr not permit type inference?

由於模板參數的類型很明顯,因此讀取/寫入示例的第二行會更容易:

#include <memory>

struct Foo{};

int main()
{
  // redundant: good
  auto foo1 = std::unique_ptr<Foo>(new Foo());
  // without explicitness: does not compile
  auto foo2 = std::unique_ptr(new Foo());
}

當然,如果你想使用多態,我們總是可以這樣寫:

auto base = std::unique_ptr<Base>(new Derived());

這種約束的原因是什么?

這不是一個問題...... std::unique_ptr獨有 -模板類的實例化不會自動從 C++17 之前的構造函數推導出類型。 這就是std::make_uniquestd::make_pairstd::make_tuple存在的原因:它們使用模板函數參數推導來減少樣板。


在 C++17 中,您將能夠編寫:

auto foo2 = std::unique_ptr(new Foo());

感謝類模板推導- 假設P0433R0被接受,它為std::unique_ptr添加了推導指南

推導指南是必需的,因為 采用原始指針的std::unique_ptr構造函數使用pointer類型別名,其定義如下:

如果該類型存在, std::remove_reference<Deleter>::type::pointer ,否則為T* 必須滿足NullablePointer

pointer這樣的類型別名是不可推導的上下文,因此 P0433R0 建議添加:

template<class T> unique_ptr(T*) 
    -> unique_ptr<T, default_delete<T>>;

template<class T, class V> unique_ptr(T*, V) 
    -> unique_ptr<T, default_delete<T, V>>;  

template<class U, class V> unique_ptr(U, V) 
    -> unique_ptr<typename pointer_traits<typename V::pointer>::element_type, V>;  

這將為std::unique_ptr啟用類模板推導

沒有扣除指南的真正原因是:

沒有從指針類型推導類模板參數, 因為無法區分從數組和非數組形式的 new 獲得的指針

旁注:另一個答案承諾c ++ 17將允許編譯:

這根本不是那么回事。 也是因為上面的原因。

暫無
暫無

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

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