【发布时间】:2013-03-08 12:02:53
【问题描述】:
我有这个功能:
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 这是一个完整的复制程序的链接:http://codepad.org/wDBdGvSN
【问题讨论】:
-
Clang 就在这里,指向 const 限定成员函数的指针的类型是
R (C::*)(Args) const并且不能转换为非 const 的。 -
但我猜你可能会说
R (C::*)(Args) const和这个一样(无效但可以理解):R (const C::*)(Args) -
不,不完全一样。以前的版本仍然可以在非常量
C对象上完美调用。 -
您可以在非 const 对象上调用 const 函数,因此它们不是严格等价的。
标签: c++ templates visual-c++ gcc clang