Предположим, у меня есть
struct X {
~X() {}
};
Каков тип и как получить указатель функции-члена X::~X()
в С++ 03?
Я не хочу на самом деле вызывать его, просто используйте в SFINAE, чтобы понять, существует ли деструктор для данного типа.
Предположим, у меня есть
struct X {
~X() {}
};
Каков тип и как получить указатель функции-члена X::~X()
в С++ 03?
Я не хочу на самом деле вызывать его, просто используйте в SFINAE, чтобы понять, существует ли деструктор для данного типа.
Вы не можете получить указатель на функцию ни деструктора, ни конструктора. Тем не менее, деструктор всегда существует для типа, и вы не можете определить, не учитываются ли его private
со спецификаторами доступа as в SFINAE.
Что касается вызова деструктора скалярного типа, в стандарте указано [class.dtor]/16:
[Примечание: обозначение явного вызова деструктора можно использовать для любого имени скалярного типа (5.2.4). Это позволяет писать код, не зная, существует ли деструктор для данного типа. Например,
typedef int I;
I* p;
p->I::~I();
-конец примечания]
boost::has_trivial_destructor
, который работает только в том случае, если компилятор предоставляет соответствующую встроенную функцию. Но если деструктор тривиален, я все равно вызываю его и позволяю компилятору оптимизировать его...
- person K-ballo; 02.06.2012
int
из стека, функцияint::~int
не вызывается. - person bitmask   schedule 02.06.2012int
неclass
, поэтому для него нет деструктора. - person K-ballo   schedule 02.06.2012typedef int I; I* p; p->I::~I();
. - person Oliver Charlesworth   schedule 02.06.2012has_trivial_destructor
таким образом. - person bitmask   schedule 02.06.2012has_trivial_destructor
требует поддержки компилятора. Не все свойства типов можно реализовать на чистом C++, и это одно из них. Если вы действительно чувствуете, что вам это нужно, прочтите документацию по вашему компилятору и посмотрите, есть ли у него такая черта. (Вы можете обмануть, загрузив трейты типа boost и просмотрев их реализацию для вашего компилятора, на самом деле не нужно добавлять зависимость в код). - person David Rodríguez - dribeas   schedule 02.06.2012