Может ли кто-нибудь объяснить, почему компиляторы (g++, visual С++) не могут вывести аргумент шаблона в этом случае?
struct MyClass
{
void Foo(int x)& {}
void Foo(int x)&& {}
};
template<typename T>
void CallFoo(void(T::*func)(int)&)
{
//create instance and call func
}
int main()
{
CallFoo(&MyClass::Foo); // Fails to deduce T
}
Почему компиляторы не могут вывести T в MyClass? Это происходит только для методов, перегруженных квалификаторами ref. Если метод перегружен конструкциями или типами параметров, все работает нормально. Кажется, что только Clang может вывести T в этом случае.