【问题标题】:destructors: triviality vs implicit definition析构函数:琐碎与隐式定义
【发布时间】:2010-10-01 08:43:26
【问题描述】:

据我了解标准,平凡析构函数是隐式声明的,其类只有基成员和非静态成员以及平凡析构函数。 鉴于此定义的递归性,在我看来,唯一的“递归停止”条件是找到具有非隐式声明的析构函数(即用户声明)的基或非静态成员。 如果这是正确的,那应该意味着微不足道的析构函数是“不需要做任何事情”的析构函数,因此它将被声明(隐式)但未定义。 换一种说法:按照标准定义,隐式定义析构函数(即“它做某事”)不能是微不足道的说法是否正确?

抱歉,我提出了这种愚蠢的问题,但我想澄清一下我脑海中的一些事情......

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    没有。隐式定义的普通析构函数根据定义是微不足道的 :) 声明和定义之间的区别在于,为了让编译器甚至看到析构函数可用,必须始终有一个声明。因此,如果您不提供一个,它将隐式提供一个。

    但是现在,如果需要(如果该类类型的对象被销毁),它也会定义一个。无论如何,它必须做一些事情:它需要调用其所有成员和基类的析构函数。一个简单的例子来说明隐式定义析构函数的效果:

    struct a {
    private:
        ~a();
    };
    
    struct bug {
        // note: can't be destructed
        a a_;
    };
    

    一旦你尝试创建一个本地的 bug 对象,编译器就会发出错误信号,因为它会产生一个 bug 的析构函数定义,它会尝试调用 a 的不可访问的析构函数。

    现在,我认为析构函数/构造函数的琐碎性主要用于对您的程序施加约束。例如,具有非平凡版本的对象不能放在联合中。另一方面,您可以删除具有不完整类型的对象,前提是它具有微不足道的析构函数。请注意,如果您的程序无法确定是否实际定义了普通析构函数,则允许编译器省略定义它。这就是所谓的as-if 规则。编译器必须表现得好像它符合标准 - 只要不改变程序的含义,优化就无关紧要。

    【讨论】:

    • 好吧,我的意思是:如果用你的话来说,“那是必要的”,它意味着它“必须做某事”,我看不出它怎么可能是微不足道的。换句话说:你能给我一个“做某事”的微不足道的析构函数的例子吗?
    • 好吧,我们有两件事:琐碎和隐含。隐式定义可以引起副作用。然后是琐碎的,用于定义在某些情况下如何使用对象的限制(例如,删除指向不完整类型的指针)
    • 例如,如果您有一个模板类,并且在基类的析构函数中引用该模板类的静态成员,则派生类对其析构函数的隐式定义将导致静态成员要实例化的模板类。
    • 我确实在这里列举了隐式定义的构造函数的不同情况:stackoverflow.com/questions/401621/…
    • 好的,我想我明白了,我只是无法理解这个“请注意,如果您的程序无法确定是否实际定义了琐碎的析构函数,则允许编译器省略定义它。”。你能详细说明一下吗?谢谢。
    【解决方案2】:

    你的措辞有点不幸。例如。当您用完成员和基类时,递归当然也会结束。这些措辞问题似乎也让你更加困惑。

    无论如何,所有隐式声明的析构函数,无论它们是否微不足道,当且仅当它们被使用时才被定义。 Used 在这里是一个特定的术语。每当 T 对象的生命周期结束时,就会使用类型 T 的析构函数

    之所以存在简单的析构函数,是因为 C 程序员将结构放在联合中。这段代码在 C++ 中应该是合法的,因此为 C++ 发明了普通析构函数的概念。当编译为 C++ 时,所有 C 结构都有微不足道的析构函数。

    【讨论】:

      【解决方案3】:

      考虑这两个类:

      class A {
      };
      
      class B {
      private:
           A obj;
      };
      

      这两个类的析构函数都是隐式定义的。然而,与此同时,按照标准定义,它们都是微不足道的。

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 1970-01-01
        • 2012-01-23
        • 2012-07-31
        • 1970-01-01
        • 2017-06-13
        • 2018-06-11
        • 1970-01-01
        相关资源
        最近更新 更多