Я читал эффективное C ++ 3-е издание. На странице 70 автор говорит:
Как и практически все классы интеллектуальных указателей,
tr1::shared_ptr
иauto_ptr
также перегружают операторы разыменования указателя (operator->
иoperator*
), что позволяет выполнять неявное преобразование в исходные необработанные указатели (...)
Затем он показывает пример с shared_ptr
(который в то время был частью tr1
) с неявным преобразованием на основе класса с именем Investment
:
shared_ptr<Investment> pi1();
bool taxable1 = !(pi1->isTaxFree());
^implicit conversion
shared_ptr<Investment> pi2();
bool taxable2 = !((*pi2).isTaxFree());
^implicit conversion
Что ж, с тех пор я написал несколько тестовых случаев с unique_ptr
, и они выдержали испытание.
Я также узнал о unique_ptr
поддерживаемых массивах и shared_ptr
также собирается (см. примечание). Однако в моем тестировании неявное преобразование не работает для интеллектуальных указателей вокруг массивов.
Пример: я хотел, чтобы это было действительным...
unique_ptr<int[]> test(new int[1]);
(*test)[0] = 5;
но это не так, согласно моему компилятору (Visual C++ 2015 Update 3).
Затем, проведя небольшое исследование, я нашел доказательства того, что неявное преобразование вообще не поддерживается... например, вот это: https://herbsutter.com/2012/06/21/reader-qa-why-dont-modern-smart-pointers-implicitly-convert-to.
На данный момент я в сомнениях. Поддерживается ли это (стандартом)или нет?
Примечание. Книга может быть немного устаревшей по этой теме, поскольку автор также говорит на странице 65, что "нет ничего похожего на auto_ptr
или tr1::shared_ptr
для динамически размещаемых массивов, даже в TR1".
*test[0] = 5;
Вы уважаете результатunique_ptr::operator[]
. Конечно, это не работает для простогоint
. - person StoryTeller - Unslander Monica   schedule 16.11.2016unique_ptr<T[]>
не имеетoperator*()
.unique_ptr<T>
имеетoperator*()
, аunique_ptr<T[]>
вместо этого имеетoperator[]()
. Так что установите значение, просто используйте:test[0] = 5;
- person David Scarlett   schedule 16.11.2016std::unique_ptr
, вместо этого рассмотрите возможность использованияstd::unique_ptr<std::vector<int>>
илиstd::unique_ptr<std::array<int, N>>
, гдеN
— длина массива. - person Ohashi   schedule 16.11.2016std::vector
напрямую. Он с радостью сам переместится, когда это необходимо. - person StoryTeller - Unslander Monica   schedule 16.11.2016unique_ptr<vector<int>>
по сравнению сvector<int>
? Единственное преимущество, о котором я могу думать, заключается в том, что вы можете передавать первый более дешево, если тип значения вектора не разрешает операции перемещения. Просто это кажется очень неловким. - person David Scarlett   schedule 16.11.2016std::shared_ptr
, потому что думал о совместном использовании одного и того же экземпляраstd::vector
. Спасибо, что указали на это. - person Ohashi   schedule 16.11.2016nothrow
, но это для случая, когда вектор перемещает элементы при изменении размера, а не для перемещения вектора. - person David Scarlett   schedule 16.11.2016