为C++编辑Google的C++ DISALLOW_COPY_AND_ASSIGN预处理器宏11移动语义

Sam*_*lMS 3 c++ google-style-guide c-preprocessor c++11

我已经在他们的C++样式指南中使用谷歌的DISALLOW_COPY_AND_ASSIGN宏几个月了,但最近我发现,额外禁用移动构造函数和移动赋值会很有用.

我之前没有写过任何真正的宏(实际上,我一直试图尽可能远离它们),所以我想从其他人那里得到一些关于我是否实现它的反馈正确.

// 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&&)
Run Code Online (Sandbox Code Playgroud)

建议和批评是非常受欢迎的.

谢谢你的时间!

Die*_*ühl 13

如果已经有声明的复制构造函数或复制赋值,则无需禁用移动构造函数或移动赋值:如果既没有复制构造函数也没有声明复制赋值赋值,则移动构造函数和移动赋值仅隐式声明为默认值.班级.将宏用于此目的似乎是安全的.

但是,可能的变化可能是将复制构造函数和复制赋值显式声明为deleted:

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(TypeName&) = delete;              \
void operator=(TypeName) = delete;
Run Code Online (Sandbox Code Playgroud)

这样,复制构造函数和复制赋值既不能从类的成员调用,也不能定义它们.

在C++中(从2011版本开始)我看不出这个宏中的任何一点:delete显式构造函数似乎很容易.