【问题标题】:How to know special member functions implementation compilers automatically generated?如何知道编译器自动生成的特殊成员函数实现?
【发布时间】:2016-01-20 12:03:48
【问题描述】:

Special member functions - Wikipedia, the free encyclopedia表示如果满足条件会自动生成下面列出的特殊成员函数。

  • 默认构造函数
  • 复制构造函数
  • 移动构造函数
  • 复制赋值运算符
  • 移动赋值运算符
  • 析构函数

第一季度。如何查看编译器自动生成的特殊成员函数的实现?

第二季度。实现是否依赖于编译器?还是C++标准定义的?

编辑 - 我的问题是编译器如何生成函数,而不是何时。我想知道编译器尽可能正确生成的源代码。我不认为这个问题与c++ - When does the compiler provide definitions for the special members of a class? - Stack Overflow 重复。

【问题讨论】:

  • Q1 很难。 Q2 在标准第 12 节中定义。
  • @BoPersson:我不认为这是重复的。另一个问题是何时 编译器应该生成特殊成员,这个问题是问 implementation 是否可用和/或由标准定义。无论如何,我已经添加了一个答案there
  • @Serge - 另一个问题/答案是指所有规则的标准§§。至少这肯定回答了第二季度。
  • @BoPersson:我不同意你的看法。我的理解是,OP不问特殊成员需要什么,而是实现源代码是否可用,并由标准定义。后一部分可以由What exactly is the “as-if” rule? 部分回答,但恕我直言,它仍然需要编译器不需要为特殊成员生成源代码的精度。
  • @SergeBallesta 如果你能在这里写下你的答案,我会接受它作为最佳答案。

标签: c++


【解决方案1】:

您无法确切知道编译器是如何实现特殊成员的。更准确地说,常见的编译器不会直接向您展示它。你可以想象编译器可以显式地为这些特殊成员生成源代码,但这不是必需的,我不知道有什么这样做的。

标准只规定:

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

从未指定如何执行,因为 1.9 程序执行 [intro.execution] §1 说

...需要符合要求的实现来模拟(仅)抽象机的可观察行为,如下所述。

(强调我的)。

并且注释将此定义为 as-if 规则:

此规定有时被称为“as-if”规则,因为实施可以随意忽略此规定的任何要求 国际标准,只要结果符合要求,只要可以从 程序的可观察行为。例如,如果可以,实际实现不需要评估表达式的一部分 推断它的值没有被使用,并且没有产生影响程序可观察行为的副作用。

【讨论】:

    【解决方案2】:

    好吧,我将从默认构造函数开始。也许其他人可以编辑它并为其他构造函数添加信息等。SO 本来是一种协作努力。

    默认构造函数。

    相关标准:

    C++14 §12.1/5

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

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

    T(){}
    

    或

    constexpr T(){}
    

    取决于它是否可以是constexpr。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多