1

根据 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我是否应该用or关键字标记所有其他特殊成员函数,delete以免每次查看编译器提供的类时不思考哪些不是?

4

1 回答 1

1

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

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

default因此,在这些情况下,如果您知道某处需要它们,您可能希望通过 using 将它们带回来。但是,在大多数情况下,您应该让编译器完成它的工作。如果其中一个功能没有自动实现,您将收到错误消息。

PS Visual Studio 尚不支持移动构造函数defaultdelete移动赋值运算符。

于 2014-07-21T10:03:06.793 回答