Почему это работает (Шаблоны, SFINAE).C++
Вопрос
ссылаясь на вчерашний пост,
это разбудило меня сегодня утром.Почему это на самом деле работает?До тех пор, пока функция 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<T>::test<T>(0)
?sizeof фактически не оценивает свои аргументы.Вот почему код, подобный следующему, является законным, даже если вы ожидаете, что он вас выручит:
int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
Другие советы
Вы не можете получить ошибку компилятора, потому что
test
-функция декларация существует.Вы не можете получить ошибку компоновщика, потому что вы не звоните
test
-функция.
Стандарт C ++ ISO/IEC 14882: 2003 (E)
5.3.3 Размер
Оператор sizeof выдает количество байтов в объектном представлении его операнда.Операндом является либо выражение, которое не оценивается, или заключенный в скобки идентификатор типа.Оператор sizeof не должен ...
...