【问题标题】:How do I get the member function pointer of a destructor?如何获取析构函数的成员函数指针?
【发布时间】:2012-06-02 00:56:00
【问题描述】:

假设我有

struct X {
  ~X() {}
};

C++03中X::~X()的成员函数指针是什么类型,如何获取?

我不想真正调用它,只是在 SFINAE 中使用来确定给定类型是否存在析构函数。

【问题讨论】:

  • 析构函数总是存在...
  • @OliCharlesworth:但是,作为一个实际功能?当我从堆栈中弹出一个int 时,没有调用int::~int 函数。
  • @bitmask: int 不是class,所以它没有析构函数
  • @bitmask:C++ 标准明确不同意你(有点);根据[class.dtor]节的结尾,以下是有效的:typedef int I; I* p; p->I::~I();
  • @Oli:这是一个“伪析构函数调用”,语法是有效的,但它没有调用任何东西。 [expr.pseudo] 说“唯一的效果是在点或箭头之前计算后缀表达式。”

标签: c++ destructor member-function-pointers c++03


【解决方案1】:

你不能得到析构函数和构造函数的函数指针。尽管如此,一个类型总是存在析构函数,并且您无法检测到它的private 是否不被SFINAE 考虑使用访问说明符。

关于调用标量类型的析构函数的主题,标准说 [class.dtor]/16

[注意:显式调用析构函数的符号可用于任何标量类型名称(5.2.4)。允许这样做可以编写代码,而不必知道给定类型是否存在析构函数。例如,

typedef int I;

我* p;

p->I::~I();

——尾注]

【讨论】:

  • 谢谢。我的动机是,如果我不调用某些对象的析构函数,我可以加速数据结构的特定部分。所以我试图确定是否有一个重要的析构函数。有什么线索吗?
  • @bitmask:由于您的问题是关于 C++03,因此您最好的选择是使用 boost::has_trivial_destructor 类型特征,只有在编译器提供适当的内在函数时才有效。但是如果析构函数是微不足道的,我认为无论如何都要调用它并让编译器对其进行优化......
  • 好吧,我不得不忍受一个残缺的 C++ 子集,因为我没有 boost 也没有 C++11。我不必销毁一个对象,而是一堆对象,但如果它们是微不足道的,则不必做任何事情,所以我不希望迭代被优化掉,所以我想将它烘焙到代码中。
  • @bitmask:看看你的残缺编译器是否已经有一个内在的......否则所有的赌注都没有
  • @bitmask:您确实认为性能成本是在破坏吗?你是怎么得出这个结论的?如果析构函数是微不足道的,编译器将看到一个空循环并且很可能将其优化掉。里程会有所不同,但您可以查看生成的代码,看看循环是否已从函数中删除。
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2020-07-15
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多