次のテンプレートクラスとそのタイプの(グローバル)変数があります。
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
ただし、これは、上記の理由などのプリミティブ型の場合でも、常にtrueを報告します。これはC++の予想される/有効な動作ですか?