Почему я не могу эффективно переместить конструкцию `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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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