Определение возможности наследования типа в C ++

У меня есть следующий шаблонный класс и (глобальная) переменная его типа:

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 ++?

6
задан Karel Petranek 6 December 2011 в 09:43
поделиться