Редактирование Google C ++ DISALLOW_COPY_AND_ASSIGN Макрос препроцессора для C ++ 11 Семантика перемещения

Я использую макрос 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&&)

Предложения и критика очень приветствуются.

Спасибо за ваше время!

2

Решение

Нет необходимости отключать конструктор перемещения или назначение перемещения, если уже существует заявленный конструктор копирования или назначение копирования: конструктор перемещения и назначение перемещения неявно объявляются как значения по умолчанию, если нет конструктора копирования или назначения копирования, объявленного для класс. Кажется безопасным оставить макрос в одиночку для этой цели.

Однако потенциальное изменение может заключаться в объявлении конструктора копирования и явном копировании присвоения как deleteд:

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(TypeName&) = delete;              \
void operator=(TypeName) = delete;

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

В C ++ (начиная с версии 2011 года) я не вижу смысла в этом макросе: кажется, что достаточно просто delete конструкторы явно.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]