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

How to know special member functions implementation compilers automatically generated?

本文关键字:实现 编译器 自动生成 函数 成员 何知道      更新时间:2023-10-16

特殊成员函数-维基百科,这个免费的百科全书说,如果满足条件,下面列出的特殊成员函数将自动生成。

  • 默认构造函数
  • 拷贝构造函数
  • <
  • 转移构造函数/gh>
  • 拷贝赋值操作符
  • 移动赋值操作符
  • 析构函数

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

Q2。实现依赖于编译器吗?还是由c++标准定义的?

编辑-我的问题是如何编译器生成函数,而不是。我想知道编译器生成的源代码尽可能正确。我不认为这个问题是c++的重复-编译器何时为类的特殊成员提供定义?-栈溢出

不能确切地知道编译器是如何实现特殊成员的。更确切地说,普通编译器不会直接向您显示它。您可以想象编译器可以显式地为这些特殊成员生成源代码,但这不是必需的,而且我不知道有任何编译器可以这样做。

标准只规定:

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

的方式从来没有被指定,因为1.9程序执行[intro]。§1说

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

(强调我的).

和注释将其定义为as-if规则:

此规定有时被称为"as-if"规则,因为实现可以自由地忽略该规则的任何要求只要结果是好像已经遵守了国际标准的要求,就可以从这方面来确定程序的可观察行为。例如,如果可以的话,实际实现不需要计算表达式的部分推断它的值没有被使用,并且没有产生影响程序的可观察行为的副作用。

好吧,我将从默认构造函数开始。也许其他人可以编辑这个并为其他构造器等添加信息。SO应该是一个协作的成果。

默认构造函数。有关standardese:

C + + 14§12.1/5

[…]隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户为该类编写的默认构造函数执行,没有 (12.6.2)和一个空的复合语句。如果用户编写的默认构造函数是病态的,那么程序就是病态的。如果用户编写的默认构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的默认构造函数是constexpr。在隐式定义类的默认默认构造函数之前,其基类的所有非用户提供的默认构造函数及其非静态数据成员应该隐式定义。[注意:隐式声明的默认构造函数有一个异常规范(15.4)。显式默认定义可能具有隐式异常-规格,参见8.4。 -end note]

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

T(){}

constexpr T(){}

取决于能否constexpr

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

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