Если адрес функции не может быть разрешен при выводе, это SFINAE или ошибка компилятора?

В C ++ 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-C ++ 0x четко указано, что должно происходить здесь?
Являются ли компиляторы ошибочными в отклонении этого кода?
Нужно ли определять «непосредственный контекст» дедукции чуть лучше?

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос