В Говоря о травах Саттера на CppCon16, он предложил написать идиому pimpl с const std::unique_ptr
(примерно 10 минут).
Как это должно работать с конструкторами/назначениями перемещения? Есть что-то в С++ 17? Я ничего не мог найти.
В Говоря о травах Саттера на CppCon16, он предложил написать идиому pimpl с const std::unique_ptr
(примерно 10 минут).
Как это должно работать с конструкторами/назначениями перемещения? Есть что-то в С++ 17? Я ничего не мог найти.
Если ваш класс не должен быть пустым, непостоянный уникальный ptr (с перемещением/назначением по умолчанию) не подходит. Перемещение ctor и присваивание перемещения будут как пустыми.
A const unique ptr отключит эти автоматические методы, и если вы хотите переместить, вам придется записать его внутри имплана (и немного клея снаружи).
Я лично напишу значение ptr с семантикой, которую хочу (тогда пусть компилятор напишет клей), но начиная с const unique_ptr звучит разумно как первый проход.
Если вы расслабляете никогда не пустое и делаете его почти никогда не пустым, вам теперь нужно рассуждать о предпосылках множества методов и возможных ошибок при запуске.
Самая большая стоимость этого метода, трудности с возвратом значений, уходит с С++ 17.
Как это должно работать с конструкторами/назначениями перемещения?
Неявно объявленный или дефолтный конструктор перемещения для класса T определяется как удаленный, если выполнено одно из следующих условий:
- T имеет нестатические элементы данных, которые не могут быть перемещены (удалены, недоступны или неоднозначные конструкторы перемещения).
const std::unique_ptr
является таким элементом данных из-за const
.
Если const
отбрасывается, компилятор генерирует конструктор перемещения и назначение, но не копирующие.
Херб объясняет, почему он использует const unique_ptr
:
non-const может работать тоже, но он более хрупкий, потому что семантика перемещения по умолчанию, вероятно, неверна.
С элементом const
он более надежный, поскольку в конструкторе должны быть инициализированы члены const
. И const
документы, что реализация объекта не изменяется, это не шаблон состояния или стратегии.