2010-03-08 22 views
66
  1. Czy auto_ptr będzie przestarzałe w przychodzącym standardzie C++?
  2. Czy należy użyć unique_ptr dla przeniesienia własności zamiast shared_ptr?
  3. Jeśli unikalna_ptr nie znajduje się w standardzie, czy muszę zamiast tego używać metody shared_ptr?

Odpowiedz

64

AKTUALIZACJA: Ta odpowiedź została napisana w 2010 roku i zgodnie z przewidywaniami std::auto_ptr została uznana za przestarzałą. Porada jest całkowicie ważna.

W C++ 0x std::auto_ptr zostanie wycofany na rzecz std::unique_ptr. Wybór inteligentnego wskaźnika zależy od Twojego przypadku użycia i Twoich wymagań, z std::unique_ptr z semantyką ruchu dla pojedynczego właściciela, która może być używana wewnątrz kontenerów (używając semantyki ruchu) i std::shared_ptr, gdy własność jest współużytkowana.

Powinieneś spróbować użyć inteligentnego wskaźnika, który najlepiej pasuje do sytuacji, wybór właściwego typu wskaźnika zapewnia innym programistom wgląd w swój projekt.

17

Tak, na dzień dzisiejszy auto_ptr będzie uznany za przestarzały w C++ 0x, a zamiast tego należy użyć unique_ptr. Z najnowszego projektu standardu (n3035) sekcja D.9

Szablon klasy auto_ptr jest przestarzały. [Uwaga: szablon klasy unique_ptr (20.9.10) zapewnia lepsze rozwiązanie. -end note]

Do czasu ratyfikacji normy, zawsze jest możliwe, że komisja dokona rewizji tej decyzji, choć wydaje mi się, że jest to mało prawdopodobne w przypadku tej decyzji.

5

Nie, nie jest przestarzałe. Być może, jeśli C++ 0x zostanie kiedykolwiek zaakceptowany. I będzie realistycznie zawsze wspierany. Nie wierzę, że jakakolwiek przestarzała funkcja została kiedykolwiek usunięta z rzeczywistych implementacji C++.

+0

+1 dla zauważając, że Nieaktualne funkcje są zachowane –

+5

standardem C++ została uaktualniona jedynie raz, i to było w zasadzie tylko sprostowanie techniczny (tj przymocowane do problemów, które były cytowane). Nic dziwnego, że niczego nie usunął. OTOH, stare funkcje są ostatecznie usuwane z kompilatorów. Na przykład, więcej C++ prawdopodobnie użyło '' niż kiedykolwiek użył 'auto_ptr', ale MS VC++ (dla jednego) już tego nie zapewnia. –

+1

@Jerry iostream.h nigdy nie był częścią żadnego standardu. I jako taki nie jest przestarzały. –

12

Nie tylko auto_ptr jest przestarzała in C++11 (D.10, page 1228), to będzie również usuniętein a future version of C++:

Przyjęte N4190, a właściwie usunięte (nie tylko przestarzałe) kilka archaiczne rzeczy z C++ biblioteki standardowej, w tym auto_ptr , bind1st/bind2nd, ptr_fun/mem_fun/mem_fun_ref, random_shuffle i kilka innych. Te są teraz usunięte z wersji standardowej biblioteki C++ 17 i nie będą częścią przyszłego przenośnego C++.

Kolejny dokument na ten temat: Programming Language C++, Library Evolution Working Group - Document N4190, jeśli chcesz uzyskać więcej informacji.

można przekształcić za pomocą kodu auto_ptr automatycznie, za pomocą unique_ptr zamiast:

Każdy kod pomocą auto_ptr można mechanicznie przekształca się za pomocą unique_ptr z move() włożonej gdy auto_ptr był „skopiowane”.