根据C ++ 11标准,您可以使用default
关键字将特殊成员函数声明为默认值。
class Foo
{
public:
Foo() = default;
Foo(const Foo& source) = default;
Foo(Foo&& source) = default;
~Foo() = default;
Foo& operator=(const Foo& right) = default;
Foo& operator=(Foo&& right) = default;
};
我想知道如果您不需要自定义实现它们,那么声明所有这些方法明确默认或删除是一个好习惯。例如,我需要为我的类实现复制构造函数和复制赋值运算符。我是否应该用default
或delete
关键字标记所有其他特殊成员函数,以便每次看到编译器提供的类而不是哪个类时都不会想到?
答案 0 :(得分:1)
这取决于。编译器何时以及是否自动生成这些函数都有规则。如果编译器不这样做并且您需要它们,您可以强制它通过使用默认值生成它们或自己实现它。编译器不会生成函数的情况是(这不是完整列表,请参考编译器的文档):
因此,在这些情况下,如果您知道某些地方需要它们,您可能希望使用default
将它们带回来。但是,在大多数情况下,您应该让编译器执行它的操作。如果其中一个功能未自动实现,您将收到错误。
P.S。 Visual Studio尚不支持移动构造函数和移动赋值运算符default
和delete
。