105

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

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

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

回答で説明したように、ユーザー定義型にも適用できるため、優れていると考えられますか? それとも、私が気付いていない他の理由もありますか?これは、特にそれが私の答えの理由であり、標準には他の何かが考えられている可能性があるためです。

4

3 に答える 3

117
  • おっしゃるとおり、名前空間は関数やオブジェクトだけでなく、あらゆるものに対して機能します。
  • グレッグが指摘したように、staticすでに多すぎることを意味します。
  • 名前空間は、グローバル スコープで可視性を制御するための統一された一貫した方法を提供します。同じことに対して異なるツールを使用する必要はありません。
  • 匿名名前空間を使用する場合、関数/オブジェクト名は適切にマングルされます。これにより、静的リンケージの "xyz" だけでなく、マングリング解除後にシンボル テーブルで "(anonymous namespace)::xyz" のようなものを確認できます。 .
  • 以下のコメントで指摘されているように、静的なものをテンプレート引数として使用することは許可されていませんが、匿名の名前空間では問題ありません。
  • もっと?多分だけど、今は他に思いつかない。
于 2011-02-12T10:22:18.113 に答える
9

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

于 2011-02-12T09:10:18.330 に答える
6

私が考える理由は2つあります。

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

ただし、委員会はこれに反対しました:staticはもはや非推奨としてマークされていませんn3225

于 2011-02-12T10:23:57.423 に答える