Я использую макрос Google DISALLOW_COPY_AND_ASSIGN из их Руководство по стилю C ++ в течение нескольких месяцев, но недавно мне пришло в голову, что было бы полезно дополнительно отключить конструктор перемещения и назначение перемещения.
Я не писал никаких настоящих макросов раньше (на самом деле я старался держаться от них подальше, насколько это возможно), поэтому я хотел бы получить отзывы от вас о том, реализовал ли я их правильно.
// Original Version
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
// Modified Version (no move semantics)
#define DISALLOW_COPY_MOVE_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&); \
TypeName(TypeName&&); \
void operator=(const TypeName&&)
Предложения и критика очень приветствуются.
Спасибо за ваше время!
Нет необходимости отключать конструктор перемещения или назначение перемещения, если уже существует заявленный конструктор копирования или назначение копирования: конструктор перемещения и назначение перемещения неявно объявляются как значения по умолчанию, если нет конструктора копирования или назначения копирования, объявленного для класс. Кажется безопасным оставить макрос в одиночку для этой цели.
Однако потенциальное изменение может заключаться в объявлении конструктора копирования и явном копировании присвоения как delete
д:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(TypeName&) = delete; \
void operator=(TypeName) = delete;
Таким образом, конструктор копирования и присвоение копии не могут быть вызваны из членов класса и не могут быть ими определены.
В C ++ (начиная с версии 2011 года) я не вижу смысла в этом макросе: кажется, что достаточно просто delete
конструкторы явно.
Других решений пока нет …