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