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重复。
答案 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()
的影响。它不使用生成的默认构造函数,并最终对内置类型的成员进行零初始化。