私はこの機能を持っています:
template <typename T, void (T::*pf)()>
void call(T& t)
{
(t.*pf)();
}
foo
適切なシグネチャ (たとえば ) を持つメソッドを持つクラスがある場合bar
、このように呼び出すことができ、call<foo, &foo::bar>();
問題ありません。ただし、gcc と msvc は、このように呼び出されたときに喜んでコンパイルしbar
ます。Clang は、2 番目のテンプレート パラメーターが無効であると文句を言います。テンプレート引数 ( )を入れると、すべてのツリーがコンパイルされます。const
call<const foo, &foo::bar>()
const
void (T::*pf)() const
const
さて、これは大きな問題ではありませんが、テンプレート引数にこれを惨めに書く必要がなければ、私のコードはずっときれいになります。
したがって、基本的な質問は次のとおりです。標準はこれについて何と言っていますか? これはclangのバグですか、それともgccとmsvcはそのようにクールなのでスライドさせているだけですか?
PS 完全な再現プログラムへのリンクは次のとおりです: http://codepad.org/wDBdGvSN