У меня есть этот код:
struct My
{
typedef int foo;
};
struct My2
{
};
template <typename T>
void Bar(const T&, int z = typename T::foo())
{
std::cout << "My" << std::endl;
}
void Bar(...)
{
std::cout << "..." << std::endl;
}
int main()
{
My my;
Bar(my); // OK
My2 my2;
Bar(my2); // Compile error: no type named ‘foo’ in ‘struct My2’
return 0;
}
Я полагаю, что если какой-либо класс T не имеет typedef foo внутри, компилятор должен исключить первую перегрузку и выбрать перегрузку с помощью многоточия. Но я проверяю этот код на MSVC, gcc и clang, и я получаю ошибку компиляции для этих компиляторов. Почему SFINAE не работает в этом случае?