Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取析构函数的成员函数指针?_C++_Destructor_Member Function Pointers_C++03 - Fatal编程技术网

C++ 如何获取析构函数的成员函数指针?

C++ 如何获取析构函数的成员函数指针?,c++,destructor,member-function-pointers,c++03,C++,Destructor,Member Function Pointers,C++03,假设我有 struct X { ~X() {} }; 在C++03中,X::~X()的成员函数指针是什么类型的,如何获取 我不想实际调用它,只想在SFINAE中使用它来判断给定类型是否存在析构函数。您无法获取析构函数或构造函数的函数指针。尽管如此,类型的析构函数始终存在,并且您无法检测SFINAE是否不考虑其带有as访问说明符的private 关于调用标量类型的析构函数,标准说[class.dtor]/16: [注:析构函数的显式调用表示法可用于任何标量类型名称(5.2.4)。允许这样做,

假设我有

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


我不想实际调用它,只想在SFINAE中使用它来判断给定类型是否存在析构函数。

您无法获取析构函数或构造函数的函数指针。尽管如此,类型的析构函数始终存在,并且您无法检测SFINAE是否不考虑其带有as访问说明符的
private

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

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

类型定义int I

I*p

p->I::~I()

-[完注]


析构函数总是存在的…@OliCharlesworth:但是,作为一个实际函数?当我从堆栈中弹出<代码> int <代码>时,没有调用<代码> int::INT/<代码>函数。@位掩码:<代码> int >代码>不是<代码>类< /> >,因此没有析构函数。@位掩码:C++标准明确地不同意您的(排序);根据[class.dtor]一节的结尾,以下内容是有效的:
typedefint I;I*p;p->I::~I()
@Oli:这是一个“伪析构函数调用”,语法有效,但它不调用任何东西。[expr.pseudo]说“唯一的效果是计算点或箭头之前的后缀表达式。”谢谢。我的动机是,如果我不调用某些对象的析构函数,我可以加速数据结构的特定部分。所以我试着决定是否有一个非平凡的析构函数。有什么线索吗?@bitmask:因为你的问题是关于C++03的,所以你最好的选择是使用
boost::has_trial_destructor
type trait with,只有在编译器提供了适当的内在特性时才有效。但是如果析构函数是微不足道的,我就把它叫做“调用”,然后让编译器优化它……嗯,我必须和残缺的C++子集一起生活,因为我没有提升,也没有C++ 11。我不必销毁一个对象,而是一堆对象,但如果它们是琐碎的,我就什么也不做,所以我不希望迭代被优化掉,所以我想将其嵌入到代码中。@bitmask:看看你残废的编译器是否已经有一个内在的。。。否则,所有的赌注都是无效的off@bitmask:您认为性能成本正在下降吗?你是怎么得出这个结论的?如果析构函数是平凡的,编译器将看到一个空循环,并且很可能将其优化掉。Milage会有所不同,但您可以查看生成的代码,并查看循环是否已从函数中删除。