Ну, это:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
Технически все еще позволяет копировать MyClass
членам и друзьям. Конечно, эти типы и функции теоретически находятся под вашим контролем, но класс все еще копируемый . По крайней мере, с boost::noncopyable
и = delete
, никто не может скопировать класс.
Я не понимаю, почему некоторые люди утверждают, что в C ++ проще сделать класс не копируемым 11.
Это не столько "проще", сколько "легче усваивается".
Учтите это:
class MyClass
{
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
};
Если вы программист на C ++, который прочитал вводный текст на C ++, но мало знаком с идиоматическим C ++ (то есть: много программистов на C ++), это ... сбивает с толку. Он объявляет конструкторы копирования и операторы копирования, но они пусты. Так зачем вообще их объявлять? Да, они private
, но это только поднимает больше вопросов: зачем делать их личными?
Чтобы понять, почему это мешает копированию, вы должны понимать, что, объявив их частными, вы сделаете так, чтобы не-участники / друзья не могли их скопировать. Это не сразу очевидно для новичка. Также не появляется сообщение об ошибке, которое они получают при попытке скопировать его.
Теперь сравните его с версией C ++ 11:
class MyClass
{
public:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
Что нужно, чтобы понять, что этот класс нельзя скопировать? Не что иное, как понимание того, что означает синтаксис = delete
. Любая книга, объясняющая правила синтаксиса C ++ 11, расскажет вам точно, что это делает. Эффект этого кода очевиден для неопытного пользователя C ++.
Что хорошо в этой идиоме, так это то, что она становится идиомой, потому что это самый ясный и очевидный способ точно сказать, что вы имеете в виду.
Даже boost::noncopyable
требует немного больше мысли. Да, это называется «не копируемый», поэтому он самодокументируется. Но если вы никогда не видели этого раньше, это вызывает вопросы. Почему вы получаете что-то, что не может быть скопировано? Почему в моих сообщениях об ошибках говорится о конструкторе копирования boost::noncopyable
? И т.д. Опять же, понимание идиомы требует больших умственных усилий.