определение статического const вне определения класса
должны ли мы определить static const
член вне определения класса, даже если он инициализируется внутри класса?
#include<iostream>
using namespace std;
class abc
{
static const int period=5;
int arr[period];
public:
void display()
{
cout<<period<<endl;
}
};
const int abc::period;
int main()
{
abc a;
a.display();
return 0;
}
после комментария // const int abc::period;
, обе версии кода отлично работают на gcc 4.3.4. Поэтому я хочу спросить, почему работают обе версии и какая из них соответствует стандарту?
1 ответов
вы определение статический член!--0--> писать const int abc::period;
. Вы можете предоставить инициализатор класса in для static const
член класса, но это не определение, а просто объявление.
9.4.2 / 4 - Если статический элемент данных имеет тип const integral или const enumeration, его объявление в определении класса может указывать константу-инициализатор, который должен быть интегральным постоянным выражением (5.19). В этом случае член может отображаться в интегральных постоянных выражениях. Элемент должен быть определен в области пространства имен, если он используется в программе, и определение области пространства имен не должно содержать инициализатор.
ваш код компилируется даже без определения, потому что вы не принимаете адрес статический член. Бьярне Страуструп упоминает в C++-FAQ здесь это вы можете взять адрес статического члена, если (и только если) он имеет Внеклассный определение