Если ваш класс не должен быть пустым, непостоянный уникальный ptr (со стандартным перемещением/назначением) не подходит. Перемещение ctor и присваивание перемещения будут как пустыми.
Исключительный ptr отключит эти автоматические методы, и если вы хотите переместить, вам придется записать его внутри имплантата (и немного клея снаружи).
Я лично напишу значение ptr с семантикой, которую хочу (тогда пусть компилятор напишет клей), но начиная с const unique_ptr звучит разумно как первый проход.
Если вы расслабляете никогда не пустое место и делаете его почти никогда не пустым, вам теперь нужно рассуждать о предпосылках множества методов и возможных ошибок.
Самая большая стоимость этой техники, трудности с возвратом значений, уходит с C++ 17.
Не прочитав разговор, очевидно, что классы с pimpl не могут быть скопированы/перемещены. Они будут создаваться в динамическом пространстве и доступны исключительно с помощью интеллектуальных указателей, причем pimpl скрывает внутренние детали реализации. –
Почему вы не хотите, чтобы большинство ваших классов pimpl были перемещаемыми?Это кажется вполне разумным делом. –
@ Денис Ярошевский может только предположить, что у него есть конкретный случай использования. В общем, я согласен с использованием 'unique_ptr'as контейнера для pimpl. Если вы хотите, чтобы его можно было копировать, вам нужно было бы реализовать это с точки зрения операции клонирования, конечно. –