2015-04-27 32 views
7

Bazen önce böyle bir kod gördüm.Akıllı işaretçi deleter

error: C2440: 'initializing' : cannot convert from 'initializer-list' to 'std::unique_ptr' No constructor could take the source type, or constructor overload resolution was ambiguous

Ama yorumsuz hat using pointer = void*; çalışıp çalışmadığını: VS2013 sayesinde söylüyor! Ayrıca diğer adın adını pointer'dan farklı bir şeye değiştirirsem aynı hatayı alırım. Yani pointer tam adı ile bir using direktifine sahip olmak çok önemlidir. Ama neden? Hiçbir açıklama bulamadım. Eğer hiçbir operator()(int*) çünkü

cevap

6

unique_ptr, T=int ile bildirilmiştir. Ancak, constructors in std::unique_ptr, bunun yerine T*, ancak pointer bağımsız değişkenini almaz.

Bu pointer tip

std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T* 

olarak tanımlanan Ve Deleter::pointer vermeyin zaman int* olarak biter ve tabii ki (Create itibaren) void* itibaren başlatılmış edilemez.

1

[C++11: 20.7.1.2/3] If the type remove_reference<D>::type::pointer exists, then unique_ptr<T, D>::pointer shall be a synonym for remove_reference<D>::type::pointer . Otherwise unique_ptr<T, D>::pointer shall be a synonym for T* . The type unique_ptr<T, D>::pointer shall satisfy the requirements of NullablePointer (17.6.3.3).

Burada 'gerekli - Eğer "hack" olduğunu etrafına operator()(void*) deleter o void* için deleter gibi davranmak yaparak yerine kullanılmak üzere izin vermek.

Sızdırıcınızın bir bütün olarak, derleme yaptığı zaman bile kesinlikle geçerli olup olmayacağını söylemek isterim.