具体的にはC ++では、たとえば次のような意味上の違いは何ですか?
static const int x = 0 ;
そして
const int x = 0 ;
static
リンケージとストレージクラス指定子の両方(つまり、関数の内部と外部)。
::
前に識別子がないプレフィックスを介してアクセスできます)。グローバル名前空間とそれにネストされている名前空間の間に意味のある違いがあることは知りません。確かにstatic
オブジェクトに関しては何もありません。
具体的にはC ++では、たとえば次のような意味上の違いは何ですか?
static const int x = 0 ;
そして
const int x = 0 ;
static
リンケージとストレージクラス指定子の両方(つまり、関数の内部と外部)。
::
前に識別子がないプレフィックスを介してアクセスできます)。グローバル名前空間とそれにネストされている名前空間の間に意味のある違いがあることは知りません。確かにstatic
オブジェクトに関しては何もありません。
回答:
ファイルスコープでは、C ++では違いはありません。 const
内部リンケージがデフォルトになり、すべてのグローバル変数には静的な有効期間があります。しかし、最初のバリアントはCでも同じ動作をするので、それを使用するのは良い理由かもしれません。
関数内では、2番目のバージョンはパラメーターから計算できます。CまたはC ++では、他の一部の言語が必要とするようなコンパイル時の定数である必要はありません。
クラス内では、基本的に関数の場合と同じです。インスタンスconst
値はctor-initializer-listで計算できます。A static const
は起動時の初期化中に設定され、残りのプログラムでは変更されません。(注:static
メンバーのコードは、宣言と初期化が分かれているため、少し異なります。)
C ++では、定数ではなく読み取り専用をconst
意味することに注意してください。ポインタがあれば、プログラムのほかの部分が見ていなくても値が変わる可能性があります。変数がで定義されている場合、初期化後に誰もそれを変更することはできませんが、初期化は依然として任意に複雑になる可能性があります。const
const
const
は、変数自体ではなく変数のビューに適用され、他の誰かがconst
同じ変数の非ビューを持つことができ、コンパイラーが変数を変更するときに非常に静かになります。
const
が、constexpr
代わりに(および他のシナリオでも)新しい方法を使用できます。実際、C ++ 0x標準は、const
そのシナリオで使用する機能を非整数型の「リテラル型」にも拡張しています。constexpr
とにかくC ++ 0x以前のコンパイラとの下位互換性を壊すことになるので、私はそれらの場合に使用することを好むと思います。
C ++ 17標準ドラフトはファイルスコープをconst
意味static
します
これは、https://stackoverflow.com/a/3709257/895245で言及された内容の引用です。
C ++ 17 n4659標準ドラフト 6.5「プログラムとリンケージ」:
3名前空間スコープ(6.3.6)を持つ名前は、それが
- (3.1)—静的に明示的に宣言されている変数、関数、または関数テンプレート。または、
- (3.2)— externが明示的に宣言されておらず、以前に外部リンケージを持つように宣言されていない、非揮発性のconst修飾型の非インライン変数。または
- (3.3)—匿名組合のデータメンバー。
付録C(参考)互換性、C.1.2条項6:「基本概念」は、これがCから変更された理由を説明します。
6.5 [また10.1.7]
変更:constが明示的に宣言されていて、externが明示的に宣言されていないファイルスコープの名前には内部リンケージがありますが、Cでは外部リンケージがあります。
理論的根拠:C ++での変換中にconstオブジェクトが値として使用される可能性があるため、この機能はプログラマーに各constオブジェクトの明示的な初期化子を提供するように促します。この機能により、ユーザーは、複数の翻訳単位に含まれるソースファイルにconstオブジェクトを配置できます。
元の機能への影響:明確な機能のセマンティクスへの変更。
変換の難しさ:セマンティック変換。
広く使用されている:まれ。
参照:constがCにないのに、C ++の内部リンケージを意味するのはなぜですか?
ヘッダーで代わりに実行する可能性が高いこと
:で詳細に説明した「constの静的」はCやC ++で何を意味するのでしょうか?
extern
ヘッダー内、cppファイル内の定義
static
おそらくC ++で最もオーバーロードされたキーワードです。コードの意味は、ネームスペーススコープにあるか、クラススコープにあるか、関数スコープにあるかによって大きく異なります。あなたはそれを明確にしたいかもしれません。