0

検討:

class Note
{
public: 
    // ...
private:
    static const char* const NOTE_NAMES[12] =
            { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
}

正常にコンパイルされますが、 IntelliSense でエラーが発生しました。

IntelliSense: 型 "const char *const [12]" のメンバーは、クラス内初期化子を持つことはできません

これはバグですか、それとも何か間違っていますか?

4

1 に答える 1

1

C++ 標準によると

不揮発性 const 静的データ メンバーが整数型または列挙型の場合、クラス定義でのその宣言では、代入式であるすべての初期化子句が定数式であるブレースまたはイコール初期化子を指定できます。

したがって、コードは C++ 標準を満たしていません。

一方で

リテラル型の静的データ メンバーは、 constexpr 指定子を使用してクラス定義で宣言できます。その場合、その宣言は、代入式であるすべての初期化句が定数式であるブレースまたはイコール初期化子を指定する必要があります

したがって、有効なコードを取得するには、記述する必要があります

static constexpr char* const NOTE_NAMES[12] =
        { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
于 2014-06-18T07:02:32.187 に答える