Po pierwsze, jeśli potrzebujesz unikalny wachlarz, sprawiają, że
std::unique_ptr<int[]> ptr;
// ^^^^^
Pozwala to inteligentne wskaźnik prawidłowego korzystania delete[]
do deallocate wskaźnik, oraz określa operator[]
naśladować normalną tablicę.
Następnie operator=
jest zdefiniowana tylko dla odniesienia rvalue unikalnych wskaźników, a nie surowych wskaźników, a surowy wskaźnik nie można niejawnie konwertowane do inteligentnego wskaźnika, aby uniknąć przypadkowego przypisania rozkładający wyjątkowość. Dlatego surowego wskaźnika nie można bezpośrednio do niego przypisać. Prawidłowe podejście jest umieścić go do konstruktora:
std::unique_ptr<int[]> ptr (new int[3]);
// ^^^^^^^^^^^^
lub użyj .reset
funkcję:
ptr.reset(new int[3]);
// ^^^^^^^ ^
lub jawnie konwertować surowego wskaźnik unikalny wskaźnik:
ptr = std::unique_ptr<int[]>(new int[3]);
// ^^^^^^^^^^^^^^^^^^^^^^^ ^
Jeśli może używać C++ 14, wolą make_unique
function niż użycie new
:
ptr = std::make_unique<int[]>(3);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
Powodem jest, że 'operator =' nie akceptuje 'int *' * i * konstruktor pobierający 'int *' jest oznaczony jako 'explicit' (zarówno dla' std :: unique_ptr 'i' std :: unique_ptr '). 'operator =' będący operatorem przypisania ruchu, a nie operator przypisania kopiowania nie ma z tym nic wspólnego. –
@LucDanton: Racja. Zaktualizowano, aby uwzględnić to. – kennytm