web-dev-qa-db-ja.com

名前のない名前空間が静的の「優れた」代替物であるのはなぜですか?

C++標準のセクション$ 7.3.1.1/2には次のように記載されています。

名前空間スコープでオブジェクトを宣言する場合、staticキーワードの使用は推奨されません。名前のない名前空間は、優れた代替手段を提供します。

名前のない名前空間が優れた代替と見なされる理由がわかりませんか?根拠は何ですか?私は標準が何を言っているかについて長い間知っていましたが、この質問に答えていたとしても、私はそれについて真剣に考えたことはありませんでした:

answer で説明したように、ユーザー定義型にも適用できるため、優れていると考えられますか?または、私が知らない他の理由もありますか?私はこれを求めています、特にそれが私の答えの理由であるので、標準は他の何かを念頭に置いているかもしれません。

82
Nawaz
  • 既に述べたように、名前空間は、関数やオブジェクトだけでなく、あらゆるものに対して機能します。
  • グレッグが指摘したように、staticはすでに多すぎることを意味します。
  • 名前空間は、グローバルスコープで可視性を制御する統一された一貫した方法を提供します。同じことに対して別のツールを使用する必要はありません。
  • 匿名の名前空間を使用すると、関数/オブジェクト名が適切にマングルされます。これにより、静的リンケージを使用した「xyz」だけでなく、デマングリング後のシンボルテーブルに「(anonymous namespace):: xyz」のようなものが表示されます。
  • 以下のコメントで指摘されているように、静的なものをテンプレート引数として使用することは許可されていませんが、匿名の名前空間では問題ありません。
  • もっと?おそらく、しかし、私は今他に何も考えられません。
90
Sergei Tachenov

理由の1つは、staticの意味がすでに多すぎることです(少なくとも3つはカウントできます)。匿名名前空間は型を含むすべてをカプセル化できるため、staticソリューションよりも優れているようです。

9
Greg Hewgill

私が考える2つの理由があります:

  • staticには2つの異なる意味があります。クラススコープでは、クラス全体で共有されることを意味しますが、ファイル/関数スコープでは、可視性/ストレージに影響します...
  • 名前のない名前空間では、新しいstructclassおよびtypedefを宣言できます。

ただし、1つ注意してください。委員会はこれについてバックペダルしました:staticn3225で非推奨としてマークされなくなりました。

7
Matthieu M.

理由が何であれ、彼らは考えを変えました: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/

4
Edward Strange