Начиная с C ++ 11, правильной идиомой для того, чтобы сделать класс не копируемым, является = delete
конструктор копирования / оператор присваивания.Это то, что программисты C ++ должны делать, и это то, что другие программисты C ++ ожидают увидеть при поиске такого поведения в вашем классе.
Хорошо иметь подобъект (член или базовый класс), который не является-copyable, и, следовательно, ваш конструктор копирования / оператор присваивания будет неявно удален.Но вы должны делать это только для подобъекта, который оказывается не подлежащим копированию.То есть, у вас есть unique_ptr<T>
или mutex
или что-то еще в качестве члена, потому что вам нужно a unique_ptr<T>
или mutex
в качестве данных экземпляра класса.Не потому, что вы используете его как хак, чтобы сделать тип не подлежащим копированию.
Недостатки использования подобъекта-члена для этой цели:
Это мешаетсмысл вашего кода.Ваш пример mutex _dummy;
говорит мне, что ваш тип содержит mutex
.Если ничто не использует эту переменную, то это говорит мне, что ваш код довольно непоследователен;если вам не нужен подобъект, вы не объявляете его.= delete
- это правильная идиома, поэтому вы должны ее использовать.
boost::noncopyable
был идиомой C ++ 98/03, потому что это был пустой класс.И, таким образом, обычная пустая базовая оптимизация гарантирует, что она не займет никакого пространства в производном классе.Пустые члены не получают такой оптимизации, поэтому член boost::noncopyable
всегда будет увеличивать ваш класс, без какой-либо выгоды.И хотя вы могли бы указать на предстоящий атрибут C ++ 20 [[no_unique_address]]
, см. Причину №1.