Mot*_*tti 19 c++ defaulted-functions c++11
C++ 11增加了告诉编译器创建任何特殊成员函数的默认实现的能力.虽然我可以看到删除函数的价值,但显式默认函数的值是什么?只需将其留空,编译器无论如何都会这样做.
我能看到的唯一一点是,只有当没有其他构造函数存在时才会创建默认构造函数:
class eg {
public:
eg(int i);
eg() = default;
};
Run Code Online (Sandbox Code Playgroud)
但这真的比你现在这样做好吗?
class eg {
public:
eg(int i);
eg() {}
};
Run Code Online (Sandbox Code Playgroud)
或者我错过了一个用例?
MSa*_*ers 19
默认构造函数将具有声明,并且该声明将受到正常访问规则的约束.例如,您可以使默认的复制构造函数受到保护.如果没有这些新声明,默认生成的成员将是公共的.
Kla*_*aim 17
来自Stroustrup网站的这些例子可能会帮助您理解这一点:
默认和删除的功能 - 默认控制
现在可以直接表达"禁止复制"的常用习语:
Run Code Online (Sandbox Code Playgroud)class X { // ... X& operator=(const X&) = delete; // Disallow copying X(const X&) = delete; };相反,我们也可以明确地说我们想要默认的复制行为:
Run Code Online (Sandbox Code Playgroud)class Y { // ... Y& operator=(const Y&) = default; // default copy semantics Y(const Y&) = default; };明确关于默认值显然是多余的,但是对这种效果的评论以及(更糟糕的)明确定义复制操作的用户意味着给出默认行为并不罕见.将它留给编译器来实现默认行为更简单,更不容易出错,并且通常会导致更好的目标代码."默认"机制可用于任何具有默认值的函数."删除"机制可用于任何功能.例如,我们可以消除不需要的转换,如下所示:
Run Code Online (Sandbox Code Playgroud)struct Z { // ... Z(long long); // can initialize with an long long Z(long) = delete; // but not anything less };
Jam*_*kin 12
除了更改生成函数的可访问性(私有/受保护)之外,您还可以将它们设置为虚拟.
struct S
{
virtual ~S();
virtual S& operator=(const S&);
};
S::~S() = default;
S& S::operator=(const S&) = default;
Run Code Online (Sandbox Code Playgroud)
可以修改默认函数的以下方面:
但要这样做,必须在课外定义函数(C++ 0x最终委员会草案中的8.4.2/2 ).
劳伦斯·克劳尔的原始提案版本就在这里.
感谢Roger Pate的澄清和引用.