Почему я не могу эффективно переместить конструкцию `std::polymorphic` из `std::polymorphic`?C++

Программы на C++. Форум разработчиков
Anonymous
Почему я не могу эффективно переместить конструкцию `std::polymorphic` из `std::polymorphic`?

Сообщение Anonymous »

Насколько я понимаю, std::polymorphic и std::indirect являются константными типами-оболочками для указателя-владельца на объект T, где цель указателя копируется вместе с самим указателем. Немного упрощая, любой из них можно рассматривать как «std::unique_ptr, который можно скопировать», причем основное различие между ними заключается в том, что std::indirect всегда будет указывать на объект точного типа T, тогда как std::polymorphic потенциально может содержать указатель на объект производного типа.
Но есть существенное отличие от 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
Я могу понять, почему это не сработает для std::indirect – в конце концов, это преобразование, если оно вообще разрешено, потребует среза, что обычно нежелательно, поэтому лучше, чтобы это не происходило случайно. Гораздо больше меня озадачивает то, что оно не работает и для std::polymorphic.
Я видел в 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

Вернуться в «C++»