Ответ 1
Как отмечено T.C.,
В конструкторе без делегирования потенциально вызывается деструктор для [...] каждого нестатического элемента данных типа класса [...]
Per DR1424, мотивация заключается в том, чтобы дать понять, что для выполнения ошибки требуется реализация, если деструктор недоступен из конструктора родительский объект ", [даже если] нет возможности исключить исключение из-за конструкции данного объекта.
Деструктор movable<T>
доступен, но он не может быть создан, поэтому ваша проблема возникает, поскольку потенциально вызываемый деструктор используется odr.
Это упрощает жизнь для разработчика, поскольку они могут просто проверить, что каждый подобъект имеет доступный и, если необходимо, реальный деструктор, и оставляйте его оптимизатору для устранения вызовов деструктора, которые не требуются. Альтернатива была бы ужасно сложной - деструктор потребовался бы или не требовался бы в зависимости от того, были ли какие-либо последующие подобъекты конструктивными и не были конструктивными.
Единственный способ избежать потенциального вызова деструктора - это использовать новое размещение, взяв на себя управление временем жизни подобъекта:
#include <new>
// ...
template<class T>
class wrapper {
public:
std::aligned_storage_t<sizeof(movable<T>), alignof(movable<T>)> m;
wrapper() noexcept { new (&m) movable<T>; };
wrapper(wrapper&& rhs) noexcept { new (&m) movable<T>{reinterpret_cast<movable<T>&&>(rhs.m)}; }
~wrapper();
};