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

C++ 如何知道特殊成员函数实现编译器自动生成?,c++,C++,表示如果满足条件,将自动生成下面列出的特殊成员函数 默认构造函数 复制构造函数 移动构造函数 复制赋值运算符 移动赋值运算符 析构函数 问题1。如何查看编译器自动生成的特殊成员函数的实现 问题2。实现是否依赖于编译器?还是由C++标准定义?< /P> 编辑-我的问题是编译器如何生成函数,而不是何时生成函数。我想知道编译器尽可能正确地生成的源代码。我不认为这个问题是重复的。您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员

表示如果满足条件,将自动生成下面列出的特殊成员函数

  • 默认构造函数
  • 复制构造函数
  • 移动构造函数
  • 复制赋值运算符
  • 移动赋值运算符
  • 析构函数
问题1。如何查看编译器自动生成的特殊成员函数的实现

问题2。实现是否依赖于编译器?还是由C++标准定义?< /P>
编辑-我的问题是编译器如何生成函数,而不是何时生成函数。我想知道编译器尽可能正确地生成的源代码。我不认为这个问题是重复的。

您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员生成源代码,但这不是必需的,我也不知道有哪种编译器可以做到这一点

本标准仅规定:

  • 编译器应自动生成这些成员的时间(回答此问题)
  • 自动生成的成员应该做什么
由于1.9程序执行[intro.execution]§1中

…一致性实现需要模拟(仅)抽象机器的可观察行为,如下所述

(强调我的观点)

注释将其定义为“假设规则”:

这一规定有时被称为“似乎”规则,因为实施可以自由地忽略这一规定的任何要求 国际标准,只要结果是符合要求,就可以从 程序的可观察行为。例如,如果可以,实际实现不需要计算表达式的一部分 推断其值未被使用,且未产生影响程序可观察行为的副作用


您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员生成源代码,但这不是必需的,我也不知道有哪种编译器可以做到这一点

本标准仅规定:

  • 编译器应自动生成这些成员的时间(回答此问题)
  • 自动生成的成员应该做什么
由于1.9程序执行[intro.execution]§1中

…一致性实现需要模拟(仅)抽象机器的可观察行为,如下所述

(强调我的观点)

注释将其定义为“假设规则”:

这一规定有时被称为“似乎”规则,因为实施可以自由地忽略这一规定的任何要求 国际标准,只要结果是符合要求,就可以从 程序的可观察行为。例如,如果可以,实际实现不需要计算表达式的一部分 推断其值未被使用,且未产生影响程序可观察行为的副作用


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

默认构造函数。 相关标准e:

C++14§12.1/5 […]隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户编写的默认构造函数为该类执行,而该类没有ctor初始值设定项(12.6.2)和空的复合语句。如果用户编写的默认构造函数格式不正确,则程序格式不正确。如果用户编写的默认构造函数满足
constexpr
构造函数(7.1.5)的要求,则隐式定义的默认构造函数是
constexpr
。在隐式定义类的默认构造函数之前,所有非用户为其基类和非用户提供的默认构造函数- 静态数据成员应已隐式定义。[注意:隐式声明的默认构造函数具有异常规范(15.4)。显式默认定义可能具有隐式异常- 规范,见8.4.-结束注释]

实际上,为类
T
生成的默认构造函数如下所示

T(){}

取决于它是否可以是
constexpr

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


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

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

默认构造函数。 相关标准e:

C++14§12.1/5 […]隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户编写的默认构造函数为该类执行,而该类没有ctor初始值设定项(12.6.2)和空的复合语句。如果用户编写的默认构造函数格式不正确,则程序格式不正确。如果该用户编写了defa
constexpr T(){}