заменяемость size_t и ENUM: законно ли?
От: varnie  
Дата: 05.07.08 16:55
Оценка:
здравствуйте.

 enum E_TYPE {
        type1,
        typ2,
        type3
 };

 void foo(const std::size_t index) {  (2)
      //...
 }

 int main(){
    
    E_TYPE example = E_TYPE::type1;
    foo(example);  //(1)
 }

я нечайно ошибса как-то раз в своем коде и спутал тип передаваемого параметра (вместо std::size_t передал enum E_TYPE), на что компилер g++ даже не выдал варнингов. потом сам нашел ошибку и исправилса.
вопрос — законна ли вышерасписанная картина по стандарту и должен ли хороший компилер выдавать варнинг на подобное?
благодарю.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: заменяемость size_t и ENUM: законно ли?
От: merk Россия  
Дата: 05.07.08 17:33
Оценка: 1 (1)
Здравствуйте, varnie, Вы писали:

V>здравствуйте.


V>
V> enum E_TYPE {
V>        type1,
V>        typ2,
V>        type3
V> };

V> void foo(const std::size_t index) {  (2)
V>      //...
V> }

V> int main(){
    
V>    E_TYPE example = E_TYPE::type1;
V>    foo(example);  //(1)
V> }
V>

V>я нечайно ошибса как-то раз в своем коде и спутал тип передаваемого параметра (вместо std::size_t передал enum E_TYPE), на что компилер g++ даже не выдал варнингов. потом сам нашел ошибку и исправилса.
V>вопрос — законна ли вышерасписанная картина по стандарту и должен ли хороший компилер выдавать варнинг на подобное?
V>благодарю.

законно. enum в С++ это просто способ задания целочисленных констант. это не настоящий enum сильнотипизированного языка, где enum приводим к целому только явно. А в С++ — приводим неявно.
И size_t тоже целый тип. ну...нужной для платформы длины в битах.
таким образом ничего не нарушено, enum и длинное целое совместимы.
Re: заменяемость size_t и ENUM: законно ли?
От: Аноним  
Дата: 05.07.08 19:18
Оценка:
Здравствуйте, varnie, Вы писали:

V> int main(){
    
V>    E_TYPE example = E_TYPE::type1;
V> }
V>

Нельзя так

7.2/10
The enum-name and each enumerator declared by an enum-specifier is declared in the scope that immediately
contains the enum-specifier.

Re: заменяемость size_t и ENUM: законно ли?
От: Alexander G Украина  
Дата: 05.07.08 20:35
Оценка:
Здравствуйте, varnie, Вы писали:

V>вопрос — законна ли вышерасписанная картина по стандарту и должен ли хороший компилер выдавать варнинг на подобное?


К сожалению, enum это действительно целочисленный тип.
Только не size_t, а int, т.е. знаковый.

enumы не совместимые с intами, и enumы произвольного типа (а не только int) будут в С++0х, возможно кое-где это уже есть как расширение.
Русский военный корабль идёт ко дну!
Re[2]: заменяемость size_t и ENUM: законно ли?
От: jazzer Россия Skype: enerjazzer
Дата: 07.07.08 10:40
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, varnie, Вы писали:


V>>вопрос — законна ли вышерасписанная картина по стандарту и должен ли хороший компилер выдавать варнинг на подобное?


AG>К сожалению, enum это действительно целочисленный тип.

AG>Только не size_t, а int, т.е. знаковый.

AG>enumы не совместимые с intами, и enumы произвольного типа (а не только int) будут в С++0х, возможно кое-где это уже есть как расширение.


Вообще-то, они уже сейчас не обязаны быть int:

The underlying type of an enumeration is an integral type that can represent all the enumerator values
defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
cannot fit in an int or unsigned int.
If the enumerator-list is empty, the underlying type is
as if the enumeration had a single enumerator with value 0. The value of sizeof() applied to an enumeration
type, an object of enumeration type, or an enumerator, is the value of sizeof() applied to the
underlying type.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.