7 c++ defaulted-functions c++11
C++ 0x允许您将某些函数指定为默认值:
struct A {
A() = default; // default ctor
A(A const&) = default; // copy ctor
A(A&&) = default; // move ctor
A(Other); // other ctor
~A() = default; // dtor
A& operator=(A const&) = default; // copy assignment
A& operator=(A&&) = default; // move assignment
};
Run Code Online (Sandbox Code Playgroud)
这些函数的实现与编译器生成它们的情况相同,这种情况通常在您未声明自己的情况下在大多数情况下发生.
如果您声明任何ctor(上述任何其他ctor),则不会生成默认ctor ,因此您可能需要将其默认为"将其恢复".
但是,除非基类或数据成员排除它们,否则类总是有一个副本并移动它们 - 如果它们被排除,则默认实现将不起作用.一个班级总是有一个dtor.
为什么需要显式默认复制ctor,移动ctor或析构函数?无论如何,隐式生成的实现不会做同样的事情吗?
小智 11
您可能需要这样做以更改其对非公共的访问权限或控制哪个翻译单元定义它们.
即使这些功能通常是公开的,您可能希望它们在非公开的同时仍然需要默认实现:
struct A {
protected:
~A();
private:
A();
A(A const&);
A(A&&);
};
// according to N3092, §8.4.2/2, cannot be non-public and defaulted
// in the class definition
A::~A() = default;
A::A() = default;
A::A(A const&) = default;
A::A(A&&) = default;
Run Code Online (Sandbox Code Playgroud)
此类可以默认构造,复制和移动,但只能由A的方法和朋友进行.这对于可能更严格控制构造的工厂非常有用.
受保护的析构函数是基类的公共虚拟/受保护 - 非虚拟指南的后半部分:
准则#4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.
此外,默认函数可用于维护稳定的二进制接口,因为您可以控制默认函数的定义位置.默认并不意味着内联,因为隐式声明的版本将是.(在上面的代码中,默认函数必须不在标题中或添加了内联说明符.)
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |