У меня есть следующий шаблонный класс и (глобальная) переменная его типа:
template <typename ClassT>
struct ClassTester : public ClassT {
typedef ClassT type;
};
ClassTester<int> *aaa; // No error here
Я ожидал бы ошибки компиляции, потому что int
не может быть получен из , но это прекрасно компилируется в Visual C ++ 2010.
Если я удалю указатель, я получаю ожидаемую ошибку компиляции (int не может быть получено из):
ClassTester<int> bbb; // Error here
Я хотел использовать этот класс для проверки SFINAE, является ли данный тип класс, который может быть производным от:
template <typename T>
struct CanBeDerivedFrom {
template <typename C>
static int test(ClassTester<T> *) { }
template <typename>
static char test(...) { }
static const bool value = (sizeof(test<T>(0)) == sizeof(int));
};
Это, однако, всегда возвращает истину, даже для примитивных типов, таких как int
, по вышеуказанной причине. Это ожидаемое / допустимое поведение C ++?