在标准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;
答案 0 :(得分:7)
假设你有
// A.h
struct A {
A();
};
和
// A.cc
A::A() { }
您可以将其更改为
// A.cc
A::A() = default;
不强制使用A.h
重新编译代码。
对于默认构造函数,这没有多大意义。 = default
占用的字符多于{ }
。但是考虑其他构造函数类型:如果不再需要明确提及每个字段,则复制或移动构造函数可能会变得更短,并且根据您正在处理的编译器和类型,默认的复制/移动构造函数甚至可能执行更好,例如,如果编译器只能在使用memcpy
语法时检测到= default
调用就足够了。