すでに合理的な答えがたくさんあります。一部の読者に役立つかもしれないアナロジーを紹介します。 実行したいプログラムのパスを検索するときに::
、ファイルシステムのディレクトリ区切り記号 ' ' とよく似た働きをします。/
検討:
/path/to/executable
これは非常に明示的です。有効な PATH に関係なく、ファイルシステム ツリー内の正確な場所にある実行可能ファイルのみがこの仕様に一致できます。同様に...
::std::cout
...C++ 名前空間「ツリー」でも同様に明示的です。
このような絶対パスとは対照的に、適切な UNIX シェル ( zshなど) を構成して、現在のディレクトリまたは環境変数の任意の要素の下の相対パスを解決できます。PATH
PATH=/usr/bin:/usr/local/bin
/tmp
X11/xterm
/tmp/X11/xterm
...見つかった場合は喜んで実行/usr/bin/X11/xterm
します/usr/local/bin/X11/xterm
。同様に、 という名前空間X
にいて、using namespace Y
有効な " " があるとします。
std::cout
...引数依存ルックアップ(ADL、別名 Koenig ルックアップ)により::X::std::cout
、 、::std::cout
、::Y::std::cout
、およびおそらく他の場所のいずれかで見つかる可能性があります。そのため、 onlyはあなたが意味するオブジェクトを正確に明示していますが、幸いなことに、正しい心の誰も「」と呼ばれる独自のクラス/構造体または名前空間を作成したり、「」と呼ばれるものを作成したりすることはないため、実際には only を使用しても問題ありません。::std::cout
std
cout
std::cout
注目すべき違い:
1) シェルは での順序付けを使用して最初の一致を使用する傾向がありPATH
ますが、あいまいな場合、C++ ではコンパイラ エラーが発生します。
2) C++ では、先行スコープのない名前を現在の名前空間で照合できますが、ほとんどの UNIX シェル.
は、PATH
.
3) C++ は常にグローバル名前空間を検索します (/
暗黙的に yourを持つようにPATH
)。
名前空間とシンボルの明示性に関する一般的な議論
絶対::abc::def::...
「パス」を使用すると、使用している他の名前空間から分離するのに役立つ場合があります。これは、使用している名前空間の一部であり、コンテンツを実際に制御することはできません。また、ライブラリのクライアント コードも使用する他のライブラリからも分離できます。一方で、シンボルの既存の「絶対」位置により緊密に結び付けられ、名前空間での暗黙的なマッチングの利点を見逃してしまいます。つまり、結合が少なくなり、名前空間間でのコードの移動が容易になり、ソース コードがより簡潔で読みやすくなります。 .
多くのことと同様に、それはバランスをとる行為です。C++ 標準では、プログラマーがコード内でまったく異なるものに使用する可能性のある、 よりも「一意的」ではない多くの識別子を配置しています (例std::
: 、、、、、) 。関係のない 2 つの非標準ライブラリが同じ識別子を使用する可能性ははるかに高くなります。これは、作成者が一般的に互いを認識していないか、ほとんど認識していないためです。また、ライブラリ (C++ 標準ライブラリを含む) は、時間の経過とともにシンボルを変更します。これらすべてにより、古いコードを再コンパイルするときにあいまいさが生じる可能性があります。特に、sが頻繁に使用されている場合は、cout
merge
includes
fill
generate
exchange
queue
toupper
max
using namespace
using namespace
任意の大量の直接的および間接的なクライアント コードが、使用する名前空間とあいまいさを管理する方法について独自の決定を下すことができないように、ヘッダーのスコープをエスケープするためのヘッダー内の s。
したがって、リーディング::
は、C++ プログラマーのツールボックスにあるツールの 1 つであり、既知の衝突を積極的に明確にし、および/または将来のあいまいさの可能性を排除します....