在类的函数声明之后,“default”是什么意思?

我已经看到在类中的函数声明旁边使用的default 。 它有什么作用?

 class C { C(const C&) = default; C(C&&) = default; C& operator=(const C&) & = default; C& operator=(C&&) & = default; virtual ~C() { } }; 

这是一个新的C ++ 11function 。

这意味着你要使用该函数的编译器生成版本,所以你不需要指定一个主体。

您也可以使用= delete来指定您希望编译器自动生成该函数。

随着移动构造器和移动赋值操作符的引入,生成构造函数,析构函数和赋值操作符的自动版本的规则变得相当复杂。 使用= default= delete可以让事情变得更简单,因为你不需要记住规则:你只要说出你想要发生的事情。

这是一个新的C ++ 0xfunction,它告诉编译器创build相应的构造函数或赋值运算符的默认版本,即只为每个成员执行复制或移动操作的运算符。 这很有用,因为移动构造函数不是总是默认生成的(例如,如果你有一个自定义的析构函数),不像复制构造函数(和赋值一样),但是如果没有什么不重要的话,最好让编译器处理它比每次拼出自己。

另外请注意,如果您提供任何其他非默认构造函数,则不会生成默认构造函数。 如果您仍然需要默认构造函数,则可以使用此语法让编译器创build一个。

作为另一个用例,在几种情况下,复制构造函数不会隐式生成(例如,如果您提供自定义移动构造函数)。 如果您仍然需要默认版本,则可以使用此语法来请求它。

细节见12.8节。

这是新的C + + 11,看到这里 。 如果您已经定义了一个构造函数,但是想要为其他构造函数使用默认值,那将会非常有用。 Pre-C ++ 11一旦你定义了一个构造函数,你就必须定义所有的构造函数,即使它们相当于默认值。

另外请注意,在某些情况下,不可能提供一个用户定义的默认构造函数,其行为与在默认和初始下编译器的行为相同。 default允许你回到那个行为。

另一个用例,我没有看到在这些答案中提到的是,它很容易让你改变构造函数的可见性。 例如,也许你想要一个朋友类能够访问复制构造函数,但是你不希望它公开可用。