2016-12-15 34 views
9

Tümü başlığında. biçimlilik kullanmak istiyorsanızNeden std :: unique_ptr, tür çıkarımına izin vermiyor?

#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()); 
} 

Elbette, her zaman yazabilirsiniz: okuma/şablon bağımsız değişken türü açıktır beri benim örnek ikinci satırını yazmak daha kolay olurdu

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

Böyle bir kısıtlamanın nedeni nedir?

+7

'std :: make_unique' (C++ 14) kullanın, bu nedenle tekrarlama yok. – Jarod42

cevap

21

Bu, std::unique_ptr'a özgü bir sorun değil - şablon sınıflarının şablon sınıfları, C++ 17'den önceki kuruculardan otomatik olarak çıkmaz. Bu nedenle, std::make_unique, std::make_pair ve std::make_tuple gibi özellikler mevcuttur: bunlar, kazanı azaltmak için şablon işlevi bağımsız değişken indirimi'u kullanır.


C++ 17 size yazmak mümkün olacak: class template deduction için

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

teşekkürler - P0433R0 varsayarak std::unique_ptr bir kesinti kılavuzunu tamamen ekleyen kabul edilir. bu tür varsa T* aksi halde,

std::remove_reference<Deleter>::type::pointer: std::unique_ptr's constructor that takes a raw pointer aşağıdaki gibi tanımlanır pointer tipi takma kullandığından

kesinti kılavuz gereklidir. NullablePointer'u karşılamalıdır. pointer gibi

Tipi adlar olmayan deducible bağlamlar, bu yüzden P0433R0 eklenmesini önermektedir: std::unique_ptr için sınıf şablonu kesinti sağlayacak

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>; 

.

+1

İyi bir yanıt, ancak şunu belirtmeliyiz ki, std :: make_unique (...) 'boilerplate'i azaltsa da, yalnızca argüman türlerini 'T' c'tor'una indirebilir - yani sadece ARGS ... 'yi çıkar. – KyleKnoepfel

İlgili konular