Подтвердить что ты не робот

Использование const std:: unique_ptr для идиомы pimpl

В Говоря о травах Саттера на CppCon16, он предложил написать идиому pimpl с const std::unique_ptr (примерно 10 минут).

Как это должно работать с конструкторами/назначениями перемещения? Есть что-то в С++ 17? Я ничего не мог найти.

4b9b3361

Ответ 1

Если ваш класс не должен быть пустым, непостоянный уникальный ptr (с перемещением/назначением по умолчанию) не подходит. Перемещение ctor и присваивание перемещения будут как пустыми.

A const unique ptr отключит эти автоматические методы, и если вы хотите переместить, вам придется записать его внутри имплана (и немного клея снаружи).

Я лично напишу значение ptr с семантикой, которую хочу (тогда пусть компилятор напишет клей), но начиная с const unique_ptr звучит разумно как первый проход.

Если вы расслабляете никогда не пустое и делаете его почти никогда не пустым, вам теперь нужно рассуждать о предпосылках множества методов и возможных ошибок при запуске.

Самая большая стоимость этого метода, трудности с возвратом значений, уходит с С++ 17.

Ответ 2

Как это должно работать с конструкторами/назначениями перемещения?

Переместить конструкторы:

Неявно объявленный или дефолтный конструктор перемещения для класса T определяется как удаленный, если выполнено одно из следующих условий:

  • T имеет нестатические элементы данных, которые не могут быть перемещены (удалены, недоступны или неоднозначные конструкторы перемещения).

const std::unique_ptr является таким элементом данных из-за const.

Если const отбрасывается, компилятор генерирует конструктор перемещения и назначение, но не копирующие.


Херб объясняет, почему он использует const unique_ptr:

non-const может работать тоже, но он более хрупкий, потому что семантика перемещения по умолчанию, вероятно, неверна.

С элементом const он более надежный, поскольку в конструкторе должны быть инициализированы члены const. И const документы, что реализация объекта не изменяется, это не шаблон состояния или стратегии.