在C ++中明确声明默认方法

时间:2014-07-21 09:52:32

标签: c++ c++11 default delete-operator code-structure

根据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;
};

我想知道如果您不需要自定义实现它们,那么声明所有这些方法明确默认或删除是一个好习惯。例如,我需要为我的类实现复制构造函数和复制赋值运算符。我是否应该用defaultdelete关键字标记所有其他特殊成员函数,以便每次看到编译器提供的类而不是哪个类时都不会想到?

1 个答案:

答案 0 :(得分:1)

这取决于。编译器何时以及是否自动生成这些函数都有规则。如果编译器不这样做并且您需要它们,您可以强制它通过使用默认值生成它们或自己实现它。编译器不会生成函数的情况是(这不是完整列表,请参考编译器的文档):

  • 当声明带参数的构造函数
  • 时,不会生成默认构造函数
  • 当你声明复制构造函数和复制赋值运算符时,没有移动构造函数和移动赋值运算符(反之亦然)

因此,在这些情况下,如果您知道某些地方需要它们,您可能希望使用default将它们带回来。但是,在大多数情况下,您应该让编译器执行它的操作。如果其中一个功能未自动实现,您将收到错误。

P.S。 Visual Studio尚不支持移动构造函数和移动赋值运算符defaultdelete