Я не уверен, являются ли они полностью взаимозаменяемыми в данном конкретном случае. Поскольку вы основываете размер элемента массива на константе, я считаю, что это должно быть перечисляемое значение. У меня нет времени на его поиск в Стандарте, но я был бы удивлен, если бы вы могли использовать int
элемент в качестве размера массива, даже если он равен static const
, поскольку фактическое значение может быть не видно заголовок.
// === in myclass.h
class MyClass {
public:
static const int MY_SIZE;
private:
int ary[MY_SIZE];
};
// === in myclass.cpp
/*static*/ const int MyClass::MY_SIZE = 10;
// === in otherclass.cpp
void OtherClass::operation(MyClass& obj) {
std::cout << "Sizeof(MyClass) = " << sizeof(obj) << std::endl;
}
Я не думаю, что компилятор может скомпилировать otherclass.cpp
, не скомпилировав myclass.cpp
.
В большинстве других случаев я бы сказал Перейти к опции статической константы класса , так как она будет более разумно участвовать в выводе типов и тому подобном. Я использую перечисляемые целочисленные константы только тогда, когда мне это действительно нужно или когда они действительно перечислимые константы (конечно).
Редактировать
Я только что взглянул на Стандарт, пока жевал на ланче (Спасибо за толчок, Дэвид)
целочисленное константное выражение может включать только литералы (2.13), перечислители,
const
инициализированные переменные или статические члены данных целочисленных типов или типов перечисления
с постоянными выражениями (8.5), нетиповые параметры шаблона целочисленного или
типы перечисления и выражения sizeof
.
Похоже, что константа и enum будут работать при условии, что вы предоставите инициализатор константы в объявлении (или это определение?).