обращаясь к вчерашнему сообщению, это разбудило меня этим утром. Почему это на самом деле работает? Пока функция test
затронут, эта функция не имеет никакого тела поэтому, как она может выполнить что-нибудь? Я хочу знать, почему и как это работает? Мне ДЕЙСТВИТЕЛЬНО интересно видеть Ваши ответы.
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*); //NO BODY HERE
template<typename C> static Two test(…); //NOR HERE
public:
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) };
enum { No = !Yes };
};
Заранее спасибо со справкой для понимания этого очень интересного явления.
Полагаю, вы имеете в виду перечисление "Да"? IsClassT
? sizeof фактически не оценивает свои аргументы. Вот почему следующий код является законным, даже если вы можете ожидать, что он вас спасет:
int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
Вы не можете получить ошибку компилятора, потому что test
-функция declaration существует.
Вы не можете получить ошибку компоновщика, потому что вы не вызываете test
-функцию.
C++ Standart ISO/IEC 14882:2003(E)
5.3.3 Sizeof
Оператор sizeof выдает количество байт в объектном представлении своего операнда. Операндом является либо выражение, которое не оценивается, либо указанный в круглых скобках тип-ид. Оператор sizeof оператор не должен ...
...