有人能解释一下为什么编译器(g++,visual c++)在这种情况下无法推导出模板参数吗?
为什么编译器无法将T推断为MyClass?这只会发生在使用ref限定符重载的方法中。如果一个方法是通过const或参数类型进行重载的,一切都正常。 似乎只有Clang可以在这种情况下推断T。
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限定符重载的方法中。如果一个方法是通过const或参数类型进行重载的,一切都正常。 似乎只有Clang可以在这种情况下推断T。
*this
的类型。 - NathanOliver&
是左值引用限定符,而&&
是右值引用限定符(绑定到临时对象); 在他的例子中,MyClass m; m.Foo(3);
将调用顶部的函数,而MyClass{}.Foo(3);
将调用底部的函数。它们作用于隐式对象参数;左值引用限定符绑定到左值引用,右值引用限定符绑定到右值引用(没有这两者的函数将参数作为左值引用,但让它绑定到任何一个)。请注意,它们实际上不会改变*this
的类型。 - Justin Time - Reinstate Monica