Сначала взгляните на то, что C++ сказал Primer об unique_ptr
и shared_ptr
:
$ 16.1.6. Эффективность и гибкость
Мы можем быть уверены, что
shared_ptr
не удерживает делетера в качестве прямого члена, потому что тип делетера неизвестен до времени выполнения.Поскольку тип делетера является частью типа
unique_ptr
, тип элемента удаления известен во время компиляции. Делетер может храниться непосредственно в каждом объектеunique_ptr
.
Таким образом, похоже, что shared_ptr
не имеет прямого члена deleter, но unique_ptr
делает. Тем не менее, в ответе на другой вопрос другого вопроса говорится:
Если вы предоставляете deleter в качестве аргумента шаблона (как в
unique_ptr
), он является частью этого типа, и вам не нужно хранить что-либо дополнительное в объектах этого типа. Если deleter передается как аргумент конструктора (как вshared_ptr
), вам нужно сохранить его в объекте. Это стоимость дополнительной гибкости, так как вы можете использовать разные удалители для объектов того же типа.
Два приведенных параграфа полностью противоречат друг другу, что меня смущает. Что еще, многие люди говорят, что unique_ptr
является нулевым накладным, поскольку ему не нужно хранить делетера в качестве члена. Однако, как известно, unique_ptr
имеет конструктор unique_ptr<obj,del> p(new obj,fcn)
, что означает, что мы можем передать ему deleter, поэтому unique_ptr
видимому, хранит deleter как член. Какой беспорядок!