どのように、そしてどのようA
にs::A
異なりますか?
最大の違いは、の宣言A
も定義であるのに対し、の宣言はそうでs::A
はないということです。「特別なルール」とはどういう意味かわかりませんstatic
が、それぞれ意味が異なります。
名前空間スコープでは、オブジェクトが現在の変換ユニットの外部に表示されないように、内部リンクを提供します。static
名前空間スコープの定数変数にはデフォルトで内部リンケージがあるため、ここでは冗長であることに注意してください。
クラススコープでは、クラスのインスタンス化に関係なく単一のオブジェクトが存在することを意味します。
それらの使用法がリテラル値に置き換えられるのはいつですか?
どちらも宣言に初期化子が含まれる整数定数であるため、どちらも定数式で使用でき、コンパイラーはそれらの値をコンパイル時の定数に置き換えることができます。
おそらく、より適切な質問は、いつ定義が必要かということです。
C ++ 11では、変数がodrで使用されている場合に必要です。大まかに言えば、変数の値ではなくアドレスを必要とする何かを行う場合です。
C ++ 03では、変数を使用する場合は必要だったと思いますが、診断は不要であり、その値のみを使用しても多くのコンパイラは文句を言いません。しかし、私は間違っている可能性があります。古いルールはかなり複雑で、今では忘れることができてうれしいです。
いつ私はそれのアドレスを取ることができますか?
そのためには、C++03とC++11の両方で変数に定義が必要です。定義は、変数にストレージを割り当てて、アドレスを持つようにします。
それらを個別に定義する必要がある場合は?
名前空間スコープでの変数宣言も、宣言しない限り定義extern
です。したがって、最初の変数に個別の定義は必要ありません。
クラススコープでの変数宣言は定義ではありません。したがって、2番目の変数は、C ++ 03で、およびodr-usedの場合はC++11で個別に定義する必要があります。