template <typename U = T, typename = decltype(U())>
static char test(void*);
static float test(...);
public:
static constexpr auto value = std::is_same_v<decltype(test(nullptr)), char>;
};
struct S1 {};
struct S2 {
S2() = delete;
};
int main() {
std::cout << IsDefaultConstructible<S1>::value << std::endl;
std::cout << IsDefaultConstructible<S2>::value << std::endl;
}
Если сделать test не шаблонной а-ля
<typename = decltype(T())>
static char test();
то подстановка аргументов будет происходить во время конструирования класса (а не вызова функции) и код будет работать некорректно. Но я не понимаю почему именно так. Мы же все равно вызываем функции, участвуем в выборе перегрузки, а поведение (в таком случае) получаем такое, будто то что в <> находится не вычисляется вообще. Кто-то может пролить свет на это ?
sfinae работает только в шаблонном контексте
Обсуждают сегодня