определение статического 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 здесь это вы можете взять адрес статического члена, если (и только если) он имеет Внеклассный определение