本当にペダンティックなルールでは、あなたのコードではその静的整数の定義が必要です。 実際のルールと、すべてのコンパイラが実装しているのは、C++ 03の規則がどのように意図されているのかということです。いいえ、定義は必要ありません。
このような静的定数の規則は、値がすぐに読み取られるような状況でのみ整数が使用され、静的メンバーが定数式で使用できる場合に定義を省略できるようにしています。
リターンステートメントでは、メンバーの値がただちに読み込まれるため、静的定数メンバの唯一の使用であれば静的定数メンバの定義を省略できます。ただし、次のような状況では定義が必要です。
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
ここで値は読み取られませんが、代わりにアドレスが使用されます。したがって、C++ 03標準の目的は、いくつかの実装ファイルで次のようなメンバの定義を提供する必要があるということです。
const int A::B::b;
注C++ 03標準に現れる実際ルールは、変数が使用される場合にのみ定数式は、がを要求される定義が必要とされないと言うこと。しかし、この規則は厳格に適用されれば、厳格すぎる。配列次元のような状況の定義を省略することができますが、return文のような場合には定義が必要になります。対応する欠陥報告はhereです。
C++ 0xの言葉は、その欠陥報告の解決を含むように更新され、あなたのコードを書かれたものとして許可します。一般的に
コード_does_には 'a'の定義が含まれています。 –
いいえ、定義は含まれていません。 –
@Henk。あんまり。 'a'または 'b'のアドレスを関数に渡して、コンパイラが生成するメッセージを確認してください。 –