Рассматривать:
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]" не может иметь инициализатор в классе
Это ошибка, или я делаю что-то неправильно?
Согласно стандарту C++
Если постоянный элемент статистических данных со стабилизатором константы является интегральным или перечисляемым, его объявление в определении класса может указывать логический или равный-инициализатор, в котором каждое предложение инициализатора, являющееся присваиванием присваивания, является постоянным выражением
Таким образом, ваш код не удовлетворяет стандарту C++.
С другой стороны
Статический член данных типа literal может быть объявлен в определении класса с помощью спецификатора constexpr; если это так, в его декларации указывается логический или равный-инициализатор, в котором каждое предложение-инициализатор, являющееся выражением-присваиванием, является постоянным выражением
Итак, чтобы получить действительный код, вы должны написать
static constexpr char* const NOTE_NAMES[12] =
{ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
constexpr
для того, чтобы этот код был действительным.