如何知道自动生成的特殊成员函数实现编译器?

时间:2015-10-21 13:07:18

标签: c++

Special member functions - Wikipedia, the free encyclopedia表示如果符合条件,将自动生成下面列出的特殊成员函数。

  • 默认构造函数
  • 复制构造函数
  • 移动构造函数
  • 复制分配运算符
  • 移动赋值运算符
  • 析构

Q1。我怎样才能看到编译器自动生成的特殊成员函数的实现?

Q2。实现是否依赖于编译器?或者它是由C ++标准定义的吗?

编辑 - 我的问题是 编译器如何生成函数,而不是 时。我想知道编译器尽可能正确生成的源代码。我不认为这个问题与c++ - When does the compiler provide definitions for the special members of a class? - Stack Overflow重复。

2 个答案:

答案 0 :(得分:0)

您无法知道编译器如何实现特殊成员。更准确地说,常见的编译器不会直接显示给您。您可以想象编译器可以明确地为这些特殊成员生成源代码,但这不是必需的,我不知道是什么做的。

标准仅指定:

  • 当这些成员应该由编译器自动生成时(在这个问题中回答)
  • 那些自动生成的成员应该做什么

从未指定过如何,因为1.9程序执行[intro.execution]§1说

  

...符合要求的实现需要模拟(仅)抽象机器的可观察行为,如下所述。

(强调我的)。

并且注释将此定义为 as-if规则

  

此规定有时被称为“as-if”规则,因为实施可以自由地忽略对此的任何要求   国际标准,只要结果就好像已经遵守了要求,只要可以从中确定   程序的可观察行为。例如,如果可以,实际实现不需要评估表达式的一部分   推断其价值未被使用,并且不会产生影响程序可观察行为的副作用。

答案 1 :(得分:0)

好吧,我将从默认构造函数开始。也许其他人可以编辑它并为其他构造函数等添加信息。所以这是一种协作努力。

默认构造函数。

相关标准:

C ++14§12.1/ 5
  

[...]隐式定义的默认构造函数执行该类的初始化集合,该集合将由该类的用户编写的默认构造函数执行,不包含 ctor-initializer (12.6.2)和一个空的复合语句。如果该用户编写的默认构造函数不正确,则程序格式错误。如果该用户编写的默认构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的默认构造函数为constexpr。在隐式定义类的默认默认构造函数之前,所有非用户提供的基类的默认构造函数及其非基类   静态数据成员应该被隐式定义。 [注意:隐式声明的默认构造函数具有 exception-specification (15.4)。明确默认的定义可能具有隐式异常 -   规范,见8.4。 -end note ]

实际上,类T生成的默认构造函数看起来像

T(){}

constexpr T(){}

取决于可以constexpr

一个重要结果是内置类型的成员未初始化,因此留有不确定值。除了char类型之外,正式UB使用这些值,尽管在实践中,在现代机器上它只是任意值。

一个重要的考虑因素是这不会影响值初始化,例如: T()的影响。它不使用生成的默认构造函数,并最终对内置类型的成员进行零初始化。