struct Example
{
static const int One = 1000; // Legal
static const short Two = 2000; // Illegal
static const float Three = 2000.0f; // Illegal
static const double Four = 3000.0; // Illegal
static const string Five = "Hello"; // Illegal
};
#2、#3、#4、#5 が違法である理由はありますか?
#5の理由はわかっていると思います:コンパイラは「実際の」文字列オブジェクトを必要とし(組み込み型ではないため)、無意識のうちに であるかのように置き換えることはできFive
ませ"Hello"
ん#define Five "Hello"
。しかし、その場合、コンパイラは .obj ファイルにヒントを残して、リンカにstring Five
どこかのインスタンスを 1 つ自動的に作成するように指示できませんか?
#3 と #4、特に #2 については (笑)... 考えられる理由がまったくわかりません! int と同様に、float と double は組み込み型です。そして short は、(おそらく) より短い整数です。
編集: Visual Studio 2008 を使用してコンパイルしています。この場合、すべてのコンパイラが同じように動作すると思いましたが、明らかに g++ は問題なくコンパイルされます (#5 を除く)。そのスニペットに対してVSが与えるエラーは次のとおりです。
エラー C2864: 'Example::Two': クラス内で初期化できるのは static const 整数データ メンバーのみです エラー C2864: 'Example::Three': クラス内で初期化できるのは static const 整数データ メンバーのみです エラー C2864: 'Example::Four': クラス内で初期化できるのは static const 整数データ メンバーのみです エラー C2864: 'Example::Five': クラス内で初期化できるのは static const 整数データ メンバーのみです