好奇心を持って、私はトリックを使用してis_classコンストラクトの代替実装を試みていましたsizeof()
。コードは次のとおりです。
template<typename T>
struct is_class
{
typedef char (&yes)[7];
typedef char (&no)[3];
static yes check (int T::*);
static no check (...);
enum { value = (sizeof(check(0)) == sizeof(yes)) };
};
問題は、インスタンス化するis_class<int>
と、コンパイルエラーが発生することです。
error: creating pointer to member of non-class type ‘int’
さて、私の質問は、(またはなど)にint T::*
適用できない場合、なぜ置換が失敗しないのかということです。コンパイラは?を選択すべきではありません。int
void*
yes check
no check