私はSubstitution Fail Is Not An Error(SFINAE)のために夫婦テンプレート化機能を使用しようとしています。そして、私はこのようにそれを行うことができます。これらのテンプレート化された関数は引数を取れないのはなぜですか?
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
しかし、私は引数がこのSNFIAEの仕事を作る方法を理解していませんよ。私は、引数を削除することができるはずとテンプレートの選択は全く同じように働くように思える:
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test();
template<typename R> static false_type Test();
をしかし、それは、私が取得していません:テスト」オーバーロードされたの
コール( ) 'があいまいです
このSFINAEを動作させるために、これらの引数についてはどういう意味ですか?
しかし、それを超えて、それらが正しい順序で評価されるようになり、これらの引数の型について特別な何かがあります。私はなぜコンパイラが 'R *'を '...'に好むのか理解していません。あなたはそれを説明できますか? –
@ JonathanMeeは、答えに追加されます。 – SergeyA
@JonathanMee単純に言えば、(...)は、オーバーロード解決を実行する際に、引数リストとの最も優先順位の低い一致です。これは設計によるものであり、標準で義務づけられています。偶然、それはまた、だから私はいつも面白い...私の2番目の引数として省略記号を使用して、コンパイラの好みを強制することができ –