2013-02-17 3 views
5
const enum Alpha{ 
    X=9, 
    Y=5, 
    Z=2 
}p; 
int main(){ 
    enum Alpha a,b; 
    a= X; 
    b= Z; 

    p = X; 
    p = Y; 

    printf("%d",a+b-p); 
    return 0; 
} 

Почему p = X и p = Y разрешены в компиляторе MSVC? Этот код выводит 6. Не следует ли присваивать значение const при инициализации и никогда больше?MSVC const enum type

+0

будет назначать p для работы p? – Arpit

+0

да, а выход 2 в этом случае –

+0

Просьба указать вашу точную версию компилятора. –

ответ

6

Это ошибка в самом компиляторе. Конец истории.

На самом деле, ваш маленький код показывает две ошибки в компиляторе. Первая ошибка здесь сами по себе:

const enum Alpha{ 
    X=9, 
    Y=5, 
    Z=2 
}p; //declaration of p is ill-formed! 

Декларация p плохо сформирована, и, таким образом, компилятор должен отклонить этот код, потому что p объявлен const, но оставил неинициализированный. Тип const скаляра (и стручок) должен быть инициализирован для того, чтобы быть хорошо образованно:

const Alpha q;  //ill-formed (same case is with p in your code) 
const Alpha r = X; //well-formed 

Для получения более подробных и детальных пояснений, увидеть это:

+0

О, вот почему он не работает в моем DevC. – Arpit

+0

Черт, я поймал ошибку :(Спасибо –

+0

Является ли 'Alpha' не-POD? Действительно? –

1

Похож ошибка.

Прежде всего, глобальные объекты const должны быть инициализированы, если определены, и default-initialization не является вариантом для типов перечисления. В соответствии с пунктом 8.5/6 C++ 11 стандарта на:

Для того, чтобы по умолчанию инициализировать объект типа Т означает:

- если Т (возможно, резюме квалифицированных) тип класса (пункт 9), конструктор по умолчанию для T называется (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);

- если T - тип массива, каждый элемент инициализируется по умолчанию;

- в противном случае инициализация не выполняется.

Если программа вызывает инициализацию по умолчанию объекта с типом const, T, то должен быть тип класса с предоставленным по умолчанию конструктором по умолчанию.

Во-вторых, после инициализации объект const не может быть назначен.

-2

Отредактировано в соответствии с консенсусом относительно того, что это ошибка компилятора.

Это работает, потому что компилятор ошибочно полагает, что p имеет тип Alpha, а не const Alpha. Если вы перепишите это как

enum Alpha{.... 
} const p; 

компилятор будет правильно жаловаться, что константа не инициализируется.

error C2734: 'p' : const object must be initialized if not extern 
error C3892: 'p' : you cannot assign to a variable that is const 

Если присвоить константе

enum Alpha{.... 
} const p = Y; 

и удалить назначение на р, все компилируется и работает, как ожидалось.

+0

* «Это работает, потому что p имеет тип' Alpha' а не 'const Alpha' *. ЭТО НЕПРАВИЛЬНО. Тип' p' - 'const Alpha', поскольку' const' применяется к переменной, а не к определению перечисления. Также 'const Alpha p' и' Alpha const p' - это то же самое! – Nawaz

+0

Я не юрист на языке. Я оставлю это экспертам. – Thomas

+0

Вам не обязательно быть «адвокатом языка» или «экспертом», чтобы это знать. C++-объявлений более чем достаточно. – Nawaz

Смежные вопросы