std
名前空間で宣言された名前を優先します。理由は§17.6.1.3/4(ISO / IEC 14882:2011(E)、C ++ 11)に記載されています。
条項18から30および付録Dに記載されている場合を除き、各ヘッダーcnameの内容は、C標準ライブラリ(1.2)またはC Unicode TRで指定されている、対応するヘッダー名の内容と同じである必要があります。.h
含める場合。ただし、C ++標準ライブラリでは、宣言(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.6)内にありますstd
。これらの名前が最初にグローバル名前空間スコープ内で宣言され、次にstd
明示的なusing-declarations(7.3.3)によって名前空間に挿入されるかどうかは指定されていません。
<c
なしで名前>
ヘッダーの名前を使用する場合std
、プログラムは不特定の要件に依存しています。
std
これは、名前が名前空間にのみ表示されることになっていたC++03以前では異なりました。ただし、実際には、多くの実装ではC標準ライブラリヘッダー<
名.h>
の内容が単純に挿入されstd
ていたため、これはC++11で対応されていました。C ++ 03標準の対応するセクション(§17.4.1.2/ 4)には次のように書かれています。
第18条から第27条に記載されている場合を除き、各ヘッダーcnameの内容は、ISO / IEC 9899:1990プログラミング言語C(第7節)またはISO / IEC:1990で指定されている、対応するヘッダー名の内容と同じでなければなりません。.h
プログラミング言語—C修正1:C整合性、(第7節)、必要に応じて、包含によるかのように。ただし、C ++標準ライブラリでは、宣言と定義(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.5)内にありますstd
。
これに加えて、名前をで修飾std::
すると、衝突を回避するのに役立ちます。完全に修飾すると、何が得られるかが正確にわかります。あなたが本当にやろうとしているのusing namespace std
ならusing std::something
、少なくともあなたができる限り最小限の範囲でそれをしてください。