在 C++ 中显式声明默认方法 [已关闭]

Explicitly declare defaulted methods in C++ [closed]

提问人:Pavel Dubsky 提问时间:7/21/2014 最后编辑:Brian Tompsett - 汤莱恩Pavel Dubsky 更新时间:9/2/2015 访问量:138

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

9年前关闭。

根据 C++ 标准,您可以使用关键字将特殊成员函数声明为默认值。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;
};

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

C++ C++11 默认 删除运算符 代码结构

评论

4赞 user703016 7/21/2014
IMO,这是纯粹的噪音:它不会为(好的)C++程序员已经知道的东西增加任何东西。
0赞 Pavel Dubsky 7/22/2014
@Park Young-Bae,你能给出一个答案,这样我就可以接受了吗?

答:

1赞 rashmatash 7/21/2014 #1

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

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

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

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

评论

1赞 juanchopanza 7/21/2014
我想OP知道这一点。他要问的是,在完全没有必要的情况下,默认或删除这些方法是否是一种好的做法。
0赞 Pavel Dubsky 7/21/2014
@rashmatash感谢您的回答,但 Juanchopanza 的假设绝对准确。我确实知道方法的创建条件,并且对在我真的不需要它们时声明它们是否是一种好的做法感兴趣
0赞 juanchopanza 7/21/2014
此外,不是编译器决定的。这些规则在语言规范中列出。