Сначала прочитайте сообщения Herb Sutters GotW, касающиеся pimpl в С++ 11:
У меня возникли проблемы с пониманием решения, предложенного в GotW # 101. Насколько я понимаю, все проблемы, которые были решены в GotW # 100, вернулись с удвоенной силой:
-
Элементы
pimpl
представляют собой шаблоны вне очереди, и определения не видны в месте использования (в определенииclass widget
класса и неявно сгенерированные специальные функции-члены изwidget
). Также нет никаких явных инстанций. Это приведет к нерешенным внешним ошибкам при связывании. -
widget::impl
по-прежнему не завершен в точке, гдеpimpl<widget::impl>::~pimpl()
заданstd::unique_ptr<widget::impl>::~unique_ptr()
вызываетdelete
указатель на неполный тип, который создает поведение undefined, еслиwidget::impl
имеет нетривиальный деструктор.
Пожалуйста, объясните, что заставляет компилятор генерировать специальные элементы в контексте, где widget::impl
завершено. Потому что я не вижу, как это работает.
Если GotW # 101 по-прежнему требует явного определения widget::~widget()
в файле реализации, где widget::impl
завершено, пожалуйста, объясните комментарий "Более прочный" (который он процитировал в своем ответе).
Я смотрю на основную претензию GotW # 101, что оболочка "исключает некоторые части шаблона", которая мне кажется (на основе остальной части абзаца) означает объявление widget::~widget()
и определение. Поэтому, пожалуйста, не полагайтесь на это в своем ответе, в GotW # 101, который ушел!
Трава, если вы заходите, пожалуйста, дайте мне знать, было ли нормально отрезать + вставить код решения здесь для справки.