この関数テンプレートを検討してください。
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
T
の呼び出しの最初の引数の型から型を推測した後、コンパイラは関数シグネチャのfoo()
置換とインスタンス化に進みます。T
戻り型の置換が最初に実行され、単純な置換が失敗した場合、コンパイラはオーバーロードセットを計算するときにこの関数テンプレートを破棄し、他の実行可能なオーバーロード(SFINAE)を検索します。
一方、2番目の関数パラメーターの置換が最初に発生し、ハードエラーが発生した場合(たとえば、非即時コンテキストでの置換の失敗が原因)、コンパイル全体が失敗します。
質問: 関数パラメーターと戻り値の型の置換が実行される順序に保証はありますか?
注: この例は、すべての主要なコンパイラー(VC11は個別にテストされ、同じ結果が得られました)で、パラメーター型の置換の前に戻り型の置換が行われることを示しているようです。