私は順序が異なることを知っている、私は例を書きました。あなたは私の質問に答えませんでした。自動テンプレート引数控除が最初の例ではなく、最初の例で機能するのはなぜですか？
以前の回答による混乱をお詫びします。
自動テンプレート控除は、タイプが明示的に指定されているため、最初の例で動作します -  `key1`はタイプ` std :: string`であると宣言されています。
2番目の例は、文字列リテラル「Apple」のタイプが「const char*」であると想定されているため失敗します。これは、 `map2`のタイプ（` std :: string`）と競合するコンパイラに矛盾しています。

エラーは、テンプレートの引数を明示的に指定することで修正できます。
`` `
int key2 = getKey <int、std :: string>（map2、 "apple"）;
`` `
または、std :: stringリテラルサフィックスを使用して：
`` `
namespace std :: string_literalsを使用しています。
int key2 = getKey（map2、 "apple"）;
`` `