Лучший выбор над бустом: scoped_ptr <T> pimpl

0

Я не использую boost только стандартную библиотеку, и в некоторых вопросах я видел, что основное различие между boost::scoped_ptr<T> и std::unique_ptr заключается в том, что boost::scoped_ptr<T> является ни возможностью копирования, ни перемещением, затем Мне было интересно, какой лучший выбор для boost::scoped_ptr<T>? Используя std::unique_ptr или используя необработанные указатели с правилом три/пять, чтобы избежать копирования и перемещения?

  • 4
    const std::unique_ptr
  • 0
    Есть причина или вы просто считаете, что это лучший вариант? Но все равно спасибо.
Показать ещё 4 комментария
Теги:
c++11
c++14
boost

2 ответа

5
Лучший ответ

Я предлагаю использовать const std::unique_ptr.

Вы почти никогда не хотите напрямую управлять исходными указателями, поэтому unique_ptr - единственный разумный вариант (shared_ptr не подходит для pimpl, редко вы хотите разделить объект impl). Добавление const сделает его не движимым, как scoped_ptr.

1

Вопрос немного неоднозначен, но ответ очень определенно, что вы должны использовать либо std :: unique_ptr, либо std :: shared_ptr, чтобы удерживать ваш pimpl, в зависимости от того, хотите ли вы, чтобы ваш класс делил состояние (shared_ptr) или имел эксклюзивный доступ с возможностью автоматического перемещения (unique_ptr).

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

Было бы разумно использовать его.

  • 1
    «Управление голыми указателями очень трудно понять правильно, невозможно, если вы управляете более чем одним в одном классе». Первое утверждение является пугающим, а второе совершенно неверным, и, разумеется, так. Я не рекомендую никому управлять голыми указателями, но, насколько я могу судить, эти утверждения просто ошибочны.
  • 0
    Я согласен с @LightnessRacesinOrbit. Правило трех, как я вставил в вопрос, - это самый простой способ обработки необработанного указателя в классе, который определяет, что он не будет разделен, и тогда у нас есть идеальное определение принадлежности. И говоря о психодиальной идиоме, инстанцирование остается внутри класса, ничего о внедрении зависимости или передаче указателя в качестве аргумента. Но я собираюсь использовать std::unique_ptr который прояснит владение и позволит избежать больше кода (и головной боли).
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню