Может ли не копируемый элемент использоваться в качестве альтернативы, чтобы сделать объект не копируемым? - PullRequest
0 голосов
/ 29 сентября 2018

Класс с не подлежащим копированию членом также называется не подлежащим копированию.Из SO, чтобы сделать класс не подлежащим копированию, это параметры:

  1. Использовать boost :: noncopyable
  2. Объявить конструктор и оператор присваивания как закрытый.
  3. Удалить конструктор копирования.

    class foo 
    {
        private:
          std::mutex _dummy;
    };
    

Вопрос: Будет ли использоваться фиктивный не копируемый элемент для аналогичной цели и для простоты?Какие минусы?

1 Ответ

0 голосов
/ 29 сентября 2018

Начиная с C ++ 11, правильной идиомой для того, чтобы сделать класс не копируемым, является = delete конструктор копирования / оператор присваивания.Это то, что программисты C ++ должны делать, и это то, что другие программисты C ++ ожидают увидеть при поиске такого поведения в вашем классе.

Хорошо иметь подобъект (член или базовый класс), который не является-copyable, и, следовательно, ваш конструктор копирования / оператор присваивания будет неявно удален.Но вы должны делать это только для подобъекта, который оказывается не подлежащим копированию.То есть, у вас есть unique_ptr<T> или mutex или что-то еще в качестве члена, потому что вам нужно a unique_ptr<T> или mutex в качестве данных экземпляра класса.Не потому, что вы используете его как хак, чтобы сделать тип не подлежащим копированию.

Недостатки использования подобъекта-члена для этой цели:

  1. Это мешаетсмысл вашего кода.Ваш пример mutex _dummy; говорит мне, что ваш тип содержит mutex.Если ничто не использует эту переменную, то это говорит мне, что ваш код довольно непоследователен;если вам не нужен подобъект, вы не объявляете его.= delete - это правильная идиома, поэтому вы должны ее использовать.

  2. boost::noncopyable был идиомой C ++ 98/03, потому что это был пустой класс.И, таким образом, обычная пустая базовая оптимизация гарантирует, что она не займет никакого пространства в производном классе.Пустые члены не получают такой оптимизации, поэтому член boost::noncopyable всегда будет увеличивать ваш класс, без какой-либо выгоды.И хотя вы могли бы указать на предстоящий атрибут C ++ 20 [[no_unique_address]], см. Причину №1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...