型が構築可能かどうかを調べるために静的チェックを実装したい:
#include <iostream>
template<typename T>
struct IsConstr
{
typedef char TrueType;
typedef struct{char a[2];} FalseType;
template<typename C>
static decltype((C(),TrueType())) test(int);
template<typename C>
static FalseType test(...);
enum{value=(sizeof(test<T>(0))==sizeof(TrueType))};
};
struct S{private: S();};
int main()
{
std::cout<<IsConstr<S>::value<<std::endl;
std::cout<<IsConstr<int>::value<<std::endl;
return 0;
}
コードがコンパイルされず、エラーが表示される
「置換に失敗しました。'S::S()' はプライベートです」.
ここで SFINAE が機能しないのはなぜですか? ありがとう。