Почему мне разрешено создавать несколько уникальных указателей из одного объекта?
Вам не разрешено это делать *, поэтому хорошо, что вы не делает это!
Не забывайте, это:
std::unique_ptr<Class> ptr = std::make_unique<Class>(a);
это **:
std::unique_ptr<Class> ptr(new Class(a));
не так:
std::unique_ptr<Class> ptr(&a);
std::make_unique
создает вещь и дает вам unique_ptr
для этой вещи.Это делается путем пересылки аргументов конструктору объекта.По общему признанию это может сбивать с толку, когда вы передаете имя существующего объекта, что приводит к использованию конструктора копирования .
tl; dr: Вы создаете копии a
.
* Что ж, с бездействующим удалителем вы можете сделать это безопасно, но давайте сохраним этот разговор на другой день ...
**Более или менее…