类"函数声明"后"默认"是什么意思?

Pau*_*nta 202 c++ default declaration keyword c++11

我见过default在类中的函数声明旁边使用过.它有什么作用?

class C {
  C(const C&) = default;
  C(C&&) = default;
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  virtual ~C() { }
};
Run Code Online (Sandbox Code Playgroud)

Pet*_*der 228

这是一个新的C++ 11功能.

这意味着您要使用该函数的编译器生成版本,因此您不需要指定正文.

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

随着移动构造函数和移动赋值运算符的引入,生成构造函数,析构函数和赋值运算符的自动版本的规则变得非常复杂.使用= default= delete简化操作,因为您不需要记住规则:您只需说出您想要发生的事情.

  • `= delete`更强:这意味着,禁止使用该函数,尽管它仍然参与重载决策. (14认同)
  • @Mayank Jindal,因为如果我们不提供无参数构造函数,如果我们已经给出了参数化构造函数,编译器会咆哮。在这种情况下,无法跳过默认构造函数的声明。 (4认同)
  • 但是,如果我们想使用编译器生成定义,那么我们是否应该跳过编写该函数而不是“先编写它然后将其分配给默认值”? (3认同)

Ker*_* SB 42

这是一个新的C++ 0x特性,它告诉编译器创建相应构造函数或赋值运算符的默认版本,即只为每个成员执行复制或移动操作的版本.这很有用,因为移动构造函数并不总是默认生成(例如,如果你有一个自定义析构函数),不像复制构造函数(同样适用于赋值),但是如果没有什么不值得写的,那么最好让它编译器处理它而不是每次自己拼出来.

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

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

有关详细信息,请参见标准的第12.8节.

  • 虽然它不仅适用于构造函数和赋值,但也适用于`operator new/new []`,`operator delete/delete []`及其重载. (4认同)

jua*_*nza 21

它是C++ 11中的新功能,请参见此处.如果您定义了一个构造函数,但想要为其他构造函数使用默认值,那么它会非常有用.预定义C++ 11一旦定义了构造函数,就必须定义它们,即使它们等同于默认值.

另请注意,在某些情况下,无法提供用户定义的默认构造函数,其行为与在默认值初始化下合成的编译器相同.default允许您恢复该行为.

  • 关于第二段,你能提供一个例子吗? (3认同)

dsh*_*hin 11

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