質問:
型のパラメーターを持つ関数はなぜconst char* は、const char 型のパラメータを持つ関数テンプレートよりも優先されます。 (&s)[N] 両方が同様に当てはまる場合?
根本原因:
この曖昧さは、コンバージョンの相対コストに起因します。オーバーロードの解決では、必要な変換操作が少ない関数が優先されます。配列は実質的に最初の要素へのポインタであり、配列からポインタへの変換のコストが配列ベースの関数テンプレートを宣言するよりも低いことを意味します。
標準説明:
C 標準によると ([over.match.best]/(1.3)、 (1.6)):
この場合:
可能性回避策:
テンプレート ベースの関数を優先するには、2 番目のオーバーロードも関数テンプレートとして定義します。
template <typename T> auto foo(T s) -> std::enable_if_t<std::is_convertible<T, char const*>{}> { std::cout << "raw, size=" << std::strlen(s) << std::endl; }
この部分的な順序付けにより、テンプレート ベースの関数が該当する場合は選択します。
以上が「const char*」関数のオーバーロードが「const char (&)[N]」テンプレート関数よりも優先されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。