24

C++11 標準の観点から、オブジェクトのステータス/プロパティに技術的な違いはありますか?

namespace
{
   int foo;
   const int bar = 42;
}

namespace
{
   static int foo;
   static const bar = 42;
}

?


このあたりの質問と回答から、匿名名前空間のオブジェクトは暗黙的に静的であると信じていましたが、誰かがそれはリンケージのみが内部であると教えてくれました。工事。したがって、匿名名前空間で静的がある場合とない場合に違いがある場合、それが実際に何を意味するのかについての詳細が必要です。

4

2 に答える 2

32

C++11、3.5/4:

名前のない名前空間、または名前のない名前空間内で直接的または間接的に宣言された名前空間には、内部リンケージがあります。他のすべての名前空間には外部リンケージがあります。上記の内部リンケージが与えられていない名前空間スコープを持つ名前は、変数 ... の名前である場合、囲んでいる名前空間と同じリンケージを持ちます

したがって、C++11 では、両方のfooオブジェクトに内部リンケージがあります。C++03 では、最初のものに外部リンケージがあります。

リンケージに関係なく、静的な保存期間があります。

標準には「オブジェクトを静的とマークされているかのように取る」というようなものはないと思うので、それには答えられません。オブジェクトが「静的とマークされている」かどうかを参照し、リンケージまたはストレージ期間のいずれにも特に言及していない標準のテキストを見つけた場合は、それを引用してください。私はあなたに意見を与えることができます:-)

于 2012-11-15T11:43:01.747 に答える
3

非常に大きな違いがあります。 withstaticでは、名前に内部リンケージがあります。それがなければ、外部リンケージがあります(ただし、別の翻訳単位で引用できない名前空間にあります)。違いは常に重要というわけではありませんが、いくつかのケースで影響を及ぼします:int*たとえば、パラメータを持つテンプレートがある場合、&fooif foois defined でインスタンス化できませんstatic

編集:

Steve Jessop が指摘したように、これは C++03 でのみ当てはまります。C++11 はここで変更を行います。理由はわかりませんが。C++03 仕様の方が一貫性があると思います。何かが含まれる名前空間はリンケージに影響を与えるべきではありません。

于 2012-11-15T11:40:42.447 に答える