Почему я не могу инициализировать статическую переменную небуквальным значением?

У меня был такой код:

int foo(void){
    return 1;
}

int main(void){
    static const int x = foo();

    //do stuff
    return 0;
}

Но я получил ошибку об инициализации статической переменной с неконстантным значением. Я думал, что это как-то связано со спецификатором const, но это не так. В конце я отбросил ключевое слово const и сделал следующее:

int foo(void){
    return 1;
}

int main(void){
    static int x = 0;
    if (x == 0) x = foo();

    //do stuff
    return 0;
}

Теперь, почему компилятор не может просто отложить инициализацию переменной static int xдо тех пор, пока она не будет использована, и, что более важно, почему он не может просто поместите его в раздел для чтения и записи и просто убедитесь, что он не записывается во время компиляции? Я хотел бы использовать ключевое слово constИ staticдля улучшения семантики в моем коде, но мне все равно, как компилятор обрабатывает это, просто пусть работает.

Правильно ли я понимаю стандарт C? Или мой компилятор отстой? Это MSVC 9.0.

7
задан Spidey 26 March 2012 в 17:46
поделиться