C++11 標準のパラグラフ 14.8.2/8 は、置換の失敗が「ハード」コンパイル エラー (それによってコンパイルが失敗する) または「ソフト」エラーになる条件を指定しています。オーバーロード解決の候補のセットからコンパイラがテンプレートを破棄するようにします (コンパイルを失敗させず、よく知られている SFINAE イディオムを有効にします)。
置換の結果が無効な型または式になる場合、型推定は失敗します。無効な型または式は、置換された引数を使用して記述した場合に不適切な形式になるものです。[ 注: アクセス チェックは置換プロセスの一部として行われます。--end note ]関数の型とそのテンプレート パラメーターの型の直接のコンテキストで無効な型と式のみが、推論の失敗につながる可能性があります。[...]
「即時コンテキスト」という単語は、C++11 標準全体で 8 回しか現れず、そのたびに、次の (非規範的な) テキストのインスタンスが続く (またはその一部として現れる):
[注:置換された型と式の評価は、クラス テンプレートの特殊化および/または関数テンプレートの特殊化のインスタンス化、暗黙的に定義された関数の生成などの副作用をもたらす可能性があります。 context」であり、プログラムの形式が正しくない可能性があります。—終わりのメモ]
このメモは、 immediate contextが何を意味するかについて (あまり寛大ではない) ヒントを与えますが、少なくとも私にとっては、置換が「ハード」なコンパイル エラーを引き起こすかどうかを判断するのに十分ではありません。
質問:
関数型とそのテンプレート パラメーター型の "即時コンテキスト" で置換エラーが発生する場合と発生しない場合を理解するのに役立つ説明、決定手順、および/またはいくつかの具体的な例を提供していただけますか?