如何从析构函数调用const成员函数

阿图尔·毕斯楚克

当const对象被销毁时,有没有可能从析构函数调用const成员函数的方法?

考虑:

struct My_type { 
    ~My_type () { 
        show ();
    }

    void show () { 
        cout << "void show ()" << endl;
    }
    void show () const { 
        cout << "void show () const" << endl;
    }
};

和用法:

My_type mt;
const My_type cmt;
mt.show ();
cmt.show ();

输出:

void show ()
void show () const
void show ()
void show ()

有人可以解释一下为什么cmt被销毁时为什么没有调用const版本的show吗?

0x499602D2

const实例上调用非const重载的原因是因为在销毁过程中不考虑当前实例上的cv限定词。[class.dtor] / p2:

析构函数用于销毁其类类型的对象。不得使用析构函数的地址。可以为const,volatile或const volatile对象调用析构函数。constvolatile语义(7.1.6.1)不适用于正在销毁的对象。当最派生对象(1.8)的析构函数启动时,它们停止生效。

您可以使用简单绑定*this到引用const来获得所需的行为:

~My_type() { 
    My_type const& ref(*this);
    ref.show();
}

或者,也许您可​​以使用一个存储引用并show()在其自己的析构函数中调用的包装器

template<class T>
struct MyTypeWrapper : std::remove_cv_t<T> {
    using Base = std::remove_cv_t<T>;
    using Base::Base;

    T&       get()       { return ref; }
    T const& get() const { return ref; }

    ~MyTypeWrapper() { ref.show(); }
private:
    T& ref = static_cast<T&>(*this);
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

来自分类Dev

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

来自分类Dev

C ++析构函数是否总是或仅有时调用数据成员析构函数?

来自分类Dev

如何跟踪析构函数在哪里被调用-C ++

来自分类Dev

析构函数调用后访问成员变量

来自分类Dev

如何定义析构函数?

来自分类Dev

从析构函数调用BeginInvoke

来自分类Dev

使用Vector创建对象时如何调用析构函数

来自分类Dev

Singleton:析构函数如何被两次调用?

来自分类Dev

在成员函数上启动线程时发生不希望的析构函数调用

来自分类Dev

如何从成员析构函数中捕获异常

来自分类Dev

是否允许成员函数显式调用其类的析构函数

来自分类Dev

如何在链表中对析构函数进行递归调用?

来自分类Dev

您如何测试是否将调用Ruby析构函数?

来自分类Dev

如何绕过成员函数结束时对析构函数的调用?

来自分类Dev

工会成员的析构函数似乎被自动调用

来自分类Dev

如何指定析构函数调用的顺序?

来自分类Dev

析构函数如何工作?

来自分类Dev

析构函数限制-从析构函数访问托管成员

来自分类Dev

C ++。在析构函数中调用虚拟成员函数

来自分类Dev

如何绕过成员函数结束时对析构函数的调用?

来自分类Dev

如何理解CPP中的调用析构函数方法?

来自分类Dev

从析构函数调用非成员函数可以吗?

来自分类Dev

如何显式调用 std 迭代器的析构函数?

来自分类Dev

C++ 可以使析构函数不调用类成员的析构函数和基类的析构函数吗?

来自分类Dev

关于析构函数调用,堆栈展开如何工作?

来自分类Dev

为什么在此处调用析构函数以及在调用该对象析构函数后如何调用对象成员函数?

来自分类Dev

析构函数调用究竟是如何进行的

来自分类Dev

析构函数调用

Related 相关文章

  1. 1

    std:map析构函数会调用键析构函数还是值析构函数?

  2. 2

    当对象绑定到成员函数时,为什么std :: function会调用析构函数?

  3. 3

    C ++析构函数是否总是或仅有时调用数据成员析构函数?

  4. 4

    如何跟踪析构函数在哪里被调用-C ++

  5. 5

    析构函数调用后访问成员变量

  6. 6

    如何定义析构函数?

  7. 7

    从析构函数调用BeginInvoke

  8. 8

    使用Vector创建对象时如何调用析构函数

  9. 9

    Singleton:析构函数如何被两次调用?

  10. 10

    在成员函数上启动线程时发生不希望的析构函数调用

  11. 11

    如何从成员析构函数中捕获异常

  12. 12

    是否允许成员函数显式调用其类的析构函数

  13. 13

    如何在链表中对析构函数进行递归调用?

  14. 14

    您如何测试是否将调用Ruby析构函数?

  15. 15

    如何绕过成员函数结束时对析构函数的调用?

  16. 16

    工会成员的析构函数似乎被自动调用

  17. 17

    如何指定析构函数调用的顺序?

  18. 18

    析构函数如何工作?

  19. 19

    析构函数限制-从析构函数访问托管成员

  20. 20

    C ++。在析构函数中调用虚拟成员函数

  21. 21

    如何绕过成员函数结束时对析构函数的调用?

  22. 22

    如何理解CPP中的调用析构函数方法?

  23. 23

    从析构函数调用非成员函数可以吗?

  24. 24

    如何显式调用 std 迭代器的析构函数?

  25. 25

    C++ 可以使析构函数不调用类成员的析构函数和基类的析构函数吗?

  26. 26

    关于析构函数调用,堆栈展开如何工作?

  27. 27

    为什么在此处调用析构函数以及在调用该对象析构函数后如何调用对象成员函数?

  28. 28

    析构函数调用究竟是如何进行的

  29. 29

    析构函数调用

热门标签

归档