3

几个月来,我一直在使用 Google 的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&&)

非常欢迎提出建议和批评。

谢谢你的时间!

4

1 回答 1

15

如果已经声明了复制构造函数或复制赋值,则无需禁用移动构造函数或移动赋值:移动构造函数和移动赋值仅在既没有声明复制构造函数也没有声明复制赋值赋值的情况下被隐式声明为默认值班上。为此目的而单独留下宏似乎是安全的。

然而,一个潜在的变化可能是将复制构造函数和复制赋值显式声明为deleted:

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

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

在 C++ 中(从 2011 年修订版开始),我在这个宏中看不到任何一点:delete显式地构造构造函数似乎很容易。

于 2013-11-17T02:59:08.000 回答