Но есть существенное отличие от std::unique_ptr:
Код: Выделить всё
struct Base {};
struct Derived : Base {};
std::unique_ptr p = std::make_unique(); // OK
std::indirect id = std::indirect(); // error
std::polymorphic pm = std::polymorphic(); // error
Я видел в P0206R6, что в какой-то момент, когда оно еще предлагалось как std::polymorphic_value, такое преобразование даже должно было быть неявным, но позже оно было изменено на явное, и к тому времени, когда предложение объединилось с P1950R2 в совместную статью P3019, конверсии исчезли полностью. В последнем проекте [polymorphic.ctor] такого конструктора нет.
Похоже, что std::polymorphic может быть создан с помощью перемещения или назначен только из другого std::polymorphic, и лучше всего создать его из цели std::polymorphic pmu (с U, производным от T) осуществляется через std::move(*pmu), который менее эффективен, поскольку создает новый объект и оставляет цель-источника в состоянии перемещения из, вместо того, чтобы передавать выделение непосредственно из источника в место назначения и оставлять источник без значения, как это происходит при перемещениях с тем же типом цели.
Почему эта емкость полностью исчезла?
Подробнее здесь: https://stackoverflow.com/questions/798 ... m-stdpolym
Мобильная версия