10

C++ 標準が、、、などにstd::hash<T>特化したことを指定しないのはなぜですか? つまり、終端の null が見つかるまで、C 文字列の内容をハッシュします。char*const char*unsigned char*const unsigned char*

std自分の特殊化を自分のコードの名前空間に挿入することに害はありますか?

4

3 に答える 3

13

C++ 標準が、、、などにstd::hash<T>特化したことを指定しないのはなぜですか?char*const char*unsigned char*const unsigned char*

提案 N1456に由来するようです。(私のものを強調)

以前のハッシュ テーブルの実装の中には、char* を特別に扱うものもありました。デフォルトのハッシュ関数は、ポインター自体ではなく、ポイントされている文字配列を調べるように特化されていました。この提案は、その特別な扱いを取り除きます。特別な処理により、C 文字列のハッシュ テーブルを使用するのが少し簡単になりますが、統一性がなくなり、一般的なコードを書くのが難しくなります。一般に、素朴なユーザーは C 文字列の代わりに std::basic_string を使用することが予想されるため、特別な処理のコストは利点を上回ります。

私がこれを正しく解釈している場合、C スタイルの文字列をサポートすると、一般的にポインターのハッシュに作用するコードが壊れてしまうという理由があります。

自分の特殊化を自分のコードの std 名前空間に挿入することに害はありますか?

潜在的な害があります、はい。

  • 将来、std名前空間に追加したものはすべて、新しいシンボル名と衝突する可能性があります。
  • 現在、名前空間に追加するものはすべてstd、標準ライブラリの他のコンポーネントと「よりよく一致」する可能性があり、静かに動作を壊します。
于 2013-04-16T19:02:18.267 に答える
2

ポインター型には標準の特殊化があります。こちらを参照してください

template< class T > struct hash<T*>;

char*そのため、 (C スタイルの文字列ではなく、一連のバイトとして)もカバーできます。

C スタイルの文字列の特殊化を意味する場合、それを実装する技術的な問題はありません。しかし、std::stringC++ には特殊化があるため、C スタイルの文字列に特殊化する価値はありません。

質問の 2 番目の部分では、名前空間にすべてを注入できstdますが、何を得ることができますか? 名前空間の目標に反しています。独自のネームスペース テリトリーを持ちます。

于 2013-04-16T19:04:06.800 に答える