C++ 如何知道特殊成员函数实现编译器自动生成?
表示如果满足条件,将自动生成下面列出的特殊成员函数C++ 如何知道特殊成员函数实现编译器自动生成?,c++,C++,表示如果满足条件,将自动生成下面列出的特殊成员函数 默认构造函数 复制构造函数 移动构造函数 复制赋值运算符 移动赋值运算符 析构函数 问题1。如何查看编译器自动生成的特殊成员函数的实现 问题2。实现是否依赖于编译器?还是由C++标准定义?< /P> 编辑-我的问题是编译器如何生成函数,而不是何时生成函数。我想知道编译器尽可能正确地生成的源代码。我不认为这个问题是重复的。您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员
- 默认构造函数
- 复制构造函数
- 移动构造函数
- 复制赋值运算符
- 移动赋值运算符
- 析构函数
编辑-我的问题是编译器如何生成函数,而不是何时生成函数。我想知道编译器尽可能正确地生成的源代码。我不认为这个问题是重复的。您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员生成源代码,但这不是必需的,我也不知道有哪种编译器可以做到这一点 本标准仅规定:
- 编译器应自动生成这些成员的时间(回答此问题)
- 自动生成的成员应该做什么
您无法确切知道编译器如何实现特殊成员。更确切地说,通用编译器不会直接向您显示它。您可以想象,编译器可以明确地为这些特殊成员生成源代码,但这不是必需的,我也不知道有哪种编译器可以做到这一点 本标准仅规定:
- 编译器应自动生成这些成员的时间(回答此问题)
- 自动生成的成员应该做什么
好的,我将从默认构造函数开始。也许其他人可以编辑这个,并为其他构造器添加信息等,所以这是一个合作的努力 默认构造函数。 相关标准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(){}