【发布时间】:2017-05-20 09:54:47
【问题描述】:
谁能解释为什么编译器(g++、visual c++)在这种情况下无法推断出模板参数?
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-ness 或参数类型重载,一切正常。 在这种情况下,似乎只有 Clang 可以推导出 T。
【问题讨论】:
-
好吧,clang accepts it happily. 可能here 所涉及的问题对于 gcc 或 vc++ 仍未解决?
-
@jaggedSpire 我越看越困惑。我不确定它是否真的对函数类型有贡献,或者只是描述了
*this的类型。 -
@NathanOliver [dcl.fct]/6: "返回类型、参数类型列表、ref-qualifier 和 cv-qualifier-seq ... 是函数的一部分类型。”和clang treats it as part of the type
-
g++7 似乎可以编译这个。
-
@NathanOliver 基本上,
&是左值引用限定符,&&是右值引用限定符(绑定到临时对象); in his example,MyClass m; m.Foo(3);would call the top one, whileMyClass{}.Foo(3);would call the bottom one。它们作用于隐式对象参数; lvalue ref-qualifier 绑定到 lvalue 引用,rvalue ref-qualifier 绑定到 rvalue 引用(既没有将参数作为左值引用但让它绑定到任何一个的函数)。请注意,它们实际上并没有改变*this的类型。
标签: c++ c++11 templates member-function-pointers ref-qualifier