在8.4.2 Explicitly-defaulted functions [dcl.fct.def.default]标准中,
显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1 12.4,12.8),这可能意味着将它们定义为已删除.如果特殊成员函数是用户声明的,并且在其第一个声明中未明确默认或删除,则由用户提供.用户提供的显式默认函数(即,在第一次声明后显式默认)是在明确默认的位置定义的; 如果将这样的函数隐式定义为已删除,则该程序格式错误. [注意:在第一次声明后将函数声明为默认值可以提供高效的执行和简洁的定义,同时为不断发展的代码库启用稳定的二进制接口.-结束语]
最后的注释是什么意思?从我所看到的,在第一次声明之后将函数声明为默认将使用户提供的函数,从而使函数变得非常简单,因此要么使类型具有非平凡的默认构造函数,要么使类型非常简单-copyable,当然使类型非平凡和非POD,同时仍然具有提供函数实际定义的实现.但我不明白这是如何导致" provide efficient execution and concise definition while enabling a stable binary interface to an evolving code base"的.任何想法都是受欢迎的,现实世界的例子受到高度赞赏.谢谢.
这种类型的一个例子:
struct A {
A();
};
A::A() = default;
Run Code Online (Sandbox Code Playgroud)
小智 7
假设你有
// A.h
struct A {
A();
};
Run Code Online (Sandbox Code Playgroud)
和
// A.cc
A::A() { }
Run Code Online (Sandbox Code Playgroud)
你可以把它改成
// A.cc
A::A() = default;
Run Code Online (Sandbox Code Playgroud)
不强制使用代码A.h重新编译.
对于默认构造函数,这没有多大意义.= default占用的角色多于{ }.但是考虑其他构造函数类型:如果不再需要明确提及每个字段,则复制或移动构造函数可能会变得更短,并且根据您正在处理的编译器和类型,默认的复制/移动构造函数甚至可能执行更好的是,例如,如果编译器只能memcpy在使用= default语法时检测到调用就足够了.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |