2012-02-06 16 views
13

Czy istnieje powód, dla którego unique_ptr::reset nie ma przeciążeń, które mają const deleter& i deleter&&, aby dopasować konstruktory, które przyjmują je jako drugi argument?Dlaczego wyjątki unique_ptr :: reset nie mają przeciążenia, które powodują deleter?

Zapisany deleter w kodzie unique_ptr zostanie przypisany do kopii lub przeniesiony z argumentem z reset. Jeśli usuwacz jest niemożliwy do skopiowania lub nieusuwalny, wywołanie odpowiedniego przeciążenia z reset nie zostanie skompilowane. Wydaje się, że byłoby to zgodne zachowanie z konstruktorami.

Odpowiedz

24

myślałem o dodając, że jednak można uzyskać równoważną funkcjonalność z operatorem przypisania ruch:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

więc zdecydowałem się nie mówi to samo z reset w interesie utrzymania API dość mała.

Aktualizacja

I żyć i uczyć się ...

Składnia rzeczywistości może być znacznie prostsze niż to, co pokażę powyżej:

ptr = {new T(another_value), D(another_state)}; 
+3

+1 za jedyną _authoritative_ odpowiedź na pytanie "dlaczego". – ildjarn

+0

Czy nie byłoby czystsze i bardziej zgodne z shared_ptr, gdyby była funkcja resetowania? Dla mnie jest to szczególnie czyste, gdy masz niestandardową funkcję deletera. Na przykład: 'ptr = unique_ptr (new_raw_ptr, deleter_function);' vs 'ptr.reset (new_raw_ptr, deleter_function);'. Lub jeszcze lepiej, gdybyśmy mogli zachować tę samą funkcję deletera, więc byłoby to jak: 'ptr.reset (new_raw_ptr);'. – felipou

+1

@felipou: Ten ostatni działa.Dla tych pierwszych, oto jak * ty * możesz to zrobić: http://cplusplus.github.io/LWG/lwg-active.html#submit_issue –

3

Ponieważ przecinak jest przechowywany w obiekcie przy budowie. Ponieważ typ deletera jest argumentem szablonu, po zbudowaniu nie ma możliwości "przekonwertowania" klasy na inną.

+0

więc wywołać operator przypisania kopia lub odpowiednio przenieść operator przypisania. Jeśli twój deleter nie ma akceptowalnego dostępnego, nie zostanie skompilowany. – David

+0

Czy to nie nadmierne wystawianie klasy, która ma służyć prostemu celowi? –

+0

Możesz kopiować konstruować i przesuwać konstrukcję - dlaczego dodanie możliwości kopiowania przypisania i przeniesienia przypisania byłoby nadmierne? Wydaje mi się, że jest to spójny poziom złożoności z inną funkcjonalnością dla mnie (to znaczy, wcale nie skomplikowaną). – David

Powiązane problemy