C++ 標準が、、、などにstd::hash<T>
特化したことを指定しないのはなぜですか? つまり、終端の null が見つかるまで、C 文字列の内容をハッシュします。char*
const char*
unsigned char*
const unsigned char*
std
自分の特殊化を自分のコードの名前空間に挿入することに害はありますか?
C++ 標準が、、、などに
std::hash<T>
特化したことを指定しないのはなぜですか?char*
const char*
unsigned char*
const unsigned char*
提案 N1456に由来するようです。(私のものを強調)
以前のハッシュ テーブルの実装の中には、char* を特別に扱うものもありました。デフォルトのハッシュ関数は、ポインター自体ではなく、ポイントされている文字配列を調べるように特化されていました。この提案は、その特別な扱いを取り除きます。特別な処理により、C 文字列のハッシュ テーブルを使用するのが少し簡単になりますが、統一性がなくなり、一般的なコードを書くのが難しくなります。一般に、素朴なユーザーは C 文字列の代わりに std::basic_string を使用することが予想されるため、特別な処理のコストは利点を上回ります。
私がこれを正しく解釈している場合、C スタイルの文字列をサポートすると、一般的にポインターのハッシュに作用するコードが壊れてしまうという理由があります。
自分の特殊化を自分のコードの std 名前空間に挿入することに害はありますか?
潜在的な害があります、はい。
std
名前空間に追加したものはすべて、新しいシンボル名と衝突する可能性があります。std
、標準ライブラリの他のコンポーネントと「よりよく一致」する可能性があり、静かに動作を壊します。ポインター型には標準の特殊化があります。こちらを参照してください
template< class T > struct hash<T*>;
char*
そのため、 (C スタイルの文字列ではなく、一連のバイトとして)もカバーできます。
C スタイルの文字列の特殊化を意味する場合、それを実装する技術的な問題はありません。しかし、std::string
C++ には特殊化があるため、C スタイルの文字列に特殊化する価値はありません。
質問の 2 番目の部分では、名前空間にすべてを注入できstd
ますが、何を得ることができますか? 名前空間の目標に反しています。独自のネームスペース テリトリーを持ちます。