В С++ 0x правила SFINAE были упрощены, так что любое недопустимое выражение или тип, который встречается в "непосредственном контексте" вывода, не приводит к ошибке компилятора, а скорее к отказу дедукции (SFINAE).
Мой вопрос таков:
Если я беру адрес перегруженной функции и не может быть разрешен, это ошибка в непосредственном контексте дедукции?
(т.е. это жесткая ошибка или SFINAE, если она не может быть разрешена)?
Вот пример кода:
struct X
{
// template<class T> T* foo(T,T); // lets not over-complicate things for now
void foo(char);
void foo(int);
};
template<class U> struct S
{
template<int> struct size_map
{ typedef int type; };
// here is where we take the address of a possibly overloaded function
template<class T> void f(T,
typename size_map<sizeof(&U::foo)>::type* = 0);
void f(...);
};
int main()
{
S<X> s;
// should this cause a compiler error because 'auto T = &X::foo' is invalid?
s.f(3);
}
Gcc 4.5 утверждает, что это ошибка компилятора, и clang выплевывает нарушение утверждения.
Вот еще несколько связанных вопросов:
Указывает ли FCD-С++ 0x, что должно произойти здесь?
Неправильно ли компиляторы отклоняют этот код?
Нужно ли определять "непосредственный контекст" дедукции немного лучше?
Спасибо!