我有这个功能:
template <typename T, void (T::*pf)()>
void call(T& t)
{
(t.*pf)();
}
如果我有foo
一个带有适当签名的方法的类(比如bar
),我可以这样调用它call<foo, &foo::bar>();
,这很好。但是,如果bar
是const
gcc 和 msvc 在这样调用时很乐意编译它call<const foo, &foo::bar>()
。Clang 抱怨第二个模板参数无效。当我放入const
模板参数(void (T::*pf)() const
)时,所有树都会编译它。
现在,这不是一个大问题,但是如果我不必const
在模板参数中编写这个可恶的代码,我的代码就会变得更加清晰。
所以问题基本上是:标准对此有何评论?这是一个clang错误还是gcc和msvc只是让它滑动,因为它们很酷?
PS这是一个完整的repro程序的链接:http://codepad.org/wDBdGvSN