在第一次声明后声明函数为默认值

时间:2014-03-28 11:43:54

标签: c++ c++11

在标准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;

1 个答案:

答案 0 :(得分:7)

假设你有

// A.h
struct A {
  A();
};

// A.cc
A::A() { }

您可以将其更改为

// A.cc
A::A() = default;

不强制使用A.h重新编译代码。

对于默认构造函数,这没有多大意义。 = default占用的字符多于{ }。但是考虑其他构造函数类型:如果不再需要明确提及每个字段,则复制或移动构造函数可能会变得更短,并且根据您正在处理的编译器和类型,默认的复制/移动构造函数甚至可能执行更好,例如,如果编译器只能在使用memcpy语法时检测到= default调用就足够了。