如何知道特殊成员函数实现编译器自动生成
How to know special member functions implementation compilers automatically generated?
特殊成员函数-维基百科,这个免费的百科全书说,如果满足条件,下面列出的特殊成员函数将自动生成。
- 默认构造函数
- 拷贝构造函数 <
- 转移构造函数/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()
的影响。它不使用生成的默认构造函数,最终对内置类型的成员进行零初始化。
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器如何实现__declspec(align(x)) / __attribute__(aligned(x)))?
- 如何在编译器C++不智能的情况下实现 GLSL vec* 构造语法?
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- C++头和实现,(为什么)它不是由IDE/编译器自动处理的
- 是否可以在不依赖内置编译器的情况下拥有is_trivially_constructible的库实现
- 尝试实现IS_CONSTEXPR() - 编译器差异
- 在不同的平台/编译器上实现相同的浮点计算结果
- 在编译器中实现受保护/私有继承
- 他们实现的开源C编译器(gcc,clang)的实际标准在哪里
- 为什么编译器会在二进制中留下嵌套函数的实现
- 编译器是否确实会实施纯虚拟驱动器的实现
- C/C 中POW()函数的实现是否随平台或编译器而变化
- 我已经在派生类中实现了纯虚拟方法,但编译器抱怨我没有
- 编译器如何实现继承
- 编译器优化合并了相同的函数实现,这意味着在运行时要绕过存根
- C++和CRTP模式的实现与编译器困境
- C++,实现函数"int next(std::string param)"时出现奇怪的编译器错误
- VC++通用Singleton实现编译器错误
- 如何知道特殊成员函数实现编译器自动生成