Я понимаю, что с помощью static_pointer_cast с unique_ptr привело бы к общей собственности содержащихся данных.
Только если вы это плохо определите. Очевидным решением было бы передать его владельцу, чтобы исходный объект оказался пустым.
Если вы не хотите передавать право собственности, просто используйте необработанный указатель.
Или, если вы хотите двух владельцев, используйте shared_ptr
.
Похоже, что ваш вопрос касается только частичной операции литья, а отчасти просто отсутствия четкой политики владения указателем. Если вам нужно несколько владельцев, независимо от того, используют ли они оба один и тот же тип, или один из них используется для другого типа, то вы не должны использовать unique_ptr
.
В любом случае, это приводит к двум уникальным ошибкам, которые никогда не должны существовать одновременно, поэтому это просто запрещено.
Правильно, это имеет смысл, абсолютно, поэтому не существует ничего подобного static_unique_pointer_cast.
Нет, это не почему его не существует. Это не существует, потому что тривиально писать его самостоятельно, если вам это нужно (и до тех пор, пока вы даете ему разумную семантику уникальной собственности). Просто получите указатель с release()
, нарисуйте его, и положите его в другой unique_ptr
. Простой и безопасный.
Это не так для shared_ptr
, где «очевидное» решение не делать правильные вещи:
shared_ptr<Derived> p2(static_cast<Derived*>(p1.get());
Это создало бы две различные shared_ptr
объекты, которые владеют тот же указатель, но дон (т. е. они оба попытаются удалить его, что приведет к неопределенному поведению).
Когда shared_ptr
был впервые стандартизован, не было безопасного способа сделать это, поэтому были определены static_pointer_cast
и соответствующие функции каста. Они нуждались в доступе к деталям реализации информации бухгалтерского учета shared_ptr
для работы.
Однако в процессе shared_ptr
стандартизации C++ 11 были расширены за счет добавления «наложения спектров конструктору», который позволяет сделать бросок просто и безопасно:
shared_ptr<Derived> p2(p1, static_cast<Derived*>(p1.get());
Если эта функция всегда была часть shared_ptr
, то возможно, возможно даже, что static_pointer_cast
никогда не был бы определен.
' static_pointer_cast' определяется только для аргумента типа 'std :: shared_ptr' - он вообще не применим с 'unique_ptr' –
@MM Да, я знаю, я написал почти то же самое в вопросе о том, что не существует эквивалента для 'unique_ptr'. – skypjack
Почему стирание типа приводит к снижению? Если вам необходимо применить базовый класс к производному типу, то чаще всего, за исключением очень небольшого числа случаев, проблема дизайна должна решаться по-разному. – Jens