「const char*」関数のオーバーロードが「const char (&)[N]」テンプレート関数よりも優先されるのはなぜですか?
オーバーロードの競合: ポインターの減衰とテンプレートの推定
質問:
型のパラメーターを持つ関数はなぜconst char* は、const char 型のパラメータを持つ関数テンプレートよりも優先されます。 (&s)[N] 両方が同様に当てはまる場合?
根本原因:
この曖昧さは、コンバージョンの相対コストに起因します。オーバーロードの解決では、必要な変換操作が少ない関数が優先されます。配列は実質的に最初の要素へのポインタであり、配列からポインタへの変換のコストが配列ベースの関数テンプレートを宣言するよりも低いことを意味します。
標準説明:
C 標準によると ([over.match.best]/(1.3)、 (1.6)):
- 特殊な関数テンプレートよりも特殊でない関数が優先されます。
- 2 つの変換が同じランクを持つ場合、それらは区別できません。
この場合:
- 配列からポインタへの変換は完全一致ランクの左辺値変換です。
- 左辺値変換を除くと、変換ランクは重要ではありません。
- したがって、どちらの変換シーケンスも優れているわけではなく、曖昧さと char const* の選択につながります。過負荷。
可能性回避策:
テンプレート ベースの関数を優先するには、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?
