Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> приведение int к enum 
:(
    Опции темы
JackYF
Дата 12.12.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Anikmar @  12.12.2006,  17:11 Найти цитируемый пост)
В Билдере срабатывает функция (...)


Как именно ты еще при этом вызываешь? С явным преобразованием или без?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 12.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Вызываю Func(1) - без явного, как и требовалось в примере
PM MAIL ICQ   Вверх
JackYF
Дата 12.12.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Anikmar, тогда можно локально поздравить Билдер smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 12.12.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  12.12.2006,  17:07 Найти цитируемый пост)
как минимум разработчики компиляторов GCC, MSVC, BCC порят отсебятину (каждый свою).

Насчёт gcc я хотел бы посмотреть примерчики (мне пока только пару багов удалось обнаружить, не считая отсутствия поддержки экспорта шаблонов :-) ).

Цитата(Anikmar @  12.12.2006,  17:11 Найти цитируемый пост)
оставляю свое мнение на подобный код при себе

В метапрограммировании подобный код используется в порядке вещей :-)

Цитата(Anikmar @  12.12.2006,  17:11 Найти цитируемый пост)
В Билдере срабатывает функция (...)

А, ну тогда предупреждение в случае без перегрузки в общем-то сойдёт :-)

Кстати, чего Builder (какой он у тебя версии?) выведет вот тут?

Код
enum En { en_zero = 0, en_two = 2 };

const int i_zero = en_zero;

void Func1(...) { cout<<"Func1(...)"<<endl; }
void Func1(bool) { cout<<"Func1(bool)"<<endl; }

void Func2(...) { cout<<"Func2(...)"<<endl; }
void Func2(int *) { cout<<"Func2(int *)"<<endl; }

int main()
{
    En en = en_two;
    Func1(en);
    Func2(en_zero);
    Func2(en_zero*1);
    Func2(en_zero*0);
    Func2(i_zero);
}


Это сообщение отредактировал(а) UnrealMan - 12.12.2006, 19:17
PM MAIL   Вверх
JackYF
Дата 12.12.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  12.12.2006,  19:05 Найти цитируемый пост)
Насчёт gcc я хотел бы посмотреть примерчики


Как тебе строчки:

Код

int n;
n = some_int_func();
char buf[n];
// ... и поехали дальше.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 12.12.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



На предложенный код, мой Билдер (6 версия) показал следующее:

enum En { en_zero = 0, en_two = 2 };

const int i_zero = en_zero;

void Func1(...) { cout<<"Func1(...)"<<endl; }
void Func1(bool) { cout<<"Func1(bool)"<<endl; }

void Func2(...) { cout<<"Func2(...)"<<endl; }
void Func2(int *) { cout<<"Func2(int *)"<<endl; }

int main()
{
    En en = en_two;

    Func1(en);               // Вызывается (bool)
    Func2(en_zero);      // Вызывается (int*)
    Func2(en_zero*1);  // Вызывается (...)
    Func2(en_zero*0);  // Вызывается (...)
    Func2(i_zero);         // Вызывается (...)
}

Касаемо стандартов и нарушений стандартов - лично я считаю, что явного нарушения стандарта в том, что неявное преобразование целого к нумератору не вызывает именно ошибки, а только предупреждение - оправдано. 
Думаю это связано с архитектурой визуального программирования - очень много свойств хранится в виде int, а грузится в свойства типа "нумератор" - если бы там были ошибки, то сложно было расширять систему (лично мое мнение).
А по поводу расширения стандарта - никакой боле-менее серьезный (а особенно красивый) проект не будет компилироваться в разных средах просто так - все равно поработать с ним придется.
Если человек пишет достаточно большую систему на VC ну никак он ее не перенесет на Builder просто так на уровне исходников. Либо он не должен пользоваться практически никакими прелестями VC
На чистом стандарте можно писать небольшие модули с узкоспециализированными задачами (например, сложную математику). Как только лезешь в украшательства проекта (а это сейчас не последнее место заниемает в программерстве) то волей неволей начинаешь пользоваться расширениями стандарта, которые имеются у конкретного компилятора.
Не берусь судить - нормально это или нет, но принять как данность придется...

PM MAIL ICQ   Вверх
UnrealMan
Дата 12.12.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Главное, чтоб корректно написанная на чистом C++ программа работала так, как предписывает ей работать стандарт. Если это не выполняется, то компилятор однозначно плох (насколько – зависит от характера и количества расхождений). Ну а расширения, делающие из некорректно составленной (с т.з. чистого C++) программы корректную (для данного компилятора) – эт, в принципе, вещь допустимая. Хотя я сомневаюсь, что вот такая некорректно составленная программа

Код
struct B;

struct A
{
    A() { cout<<"A()"<<endl; }
    A(const B &) { cout<<"A(B)"<<endl; }
};

struct B
{
    operator A() const { cout<<"B::operator A()"<<endl; return A(); }
};

int main()
{
    B b;
    A a = b; // MinGW-3.4.4: вызывается конструктор A(const B &)
    // хотя здесь неоднозначность
}

в MinGW работает благодаря какому-то целенаправленно созданному расширению, учитывая что следующая программа

Код
struct B;

struct A
{
    A() { cout<<"A()"<<endl; }
    A(B &) { cout<<"A(B)"<<endl; }
};

struct B
{
    operator A() { cout<<"B::operator A()"<<endl; return A(); }
};

int main()
{
    B b;
    A a = b; // MinGW-3.4.4: error: conversion from `B' to `A' is ambiguous
}

уже не компилируется :-)

Цитата(JackYF @  12.12.2006,  19:57 Найти цитируемый пост)
Как тебе строчки:

А, ну да, чего-то такое припоминаю :-) У такого объекта ещё тип какой-то странный, и для него typeid неприменим.

Цитата(Anikmar @  12.12.2006,  20:51 Найти цитируемый пост)

Func1(en);               // Вызывается (bool)
Func2(en_zero);      // Вызывается (int*)
Func2(en_zero*1);  // Вызывается (...)
Func2(en_zero*0);  // Вызывается (...)
Func2(i_zero);         // Вызывается (...)

Ты точно ничего не перепутал? :-)) Должно быть:

Код
Func1(en);               // Вызывается (bool)
Func2(en_zero);      // Вызывается (...)
Func2(en_zero*1);  // Вызывается (int *)
Func2(en_zero*0);  // Вызывается (int *)
Func2(i_zero);         // Вызывается (int *)

PM MAIL   Вверх
Anikmar
Дата 12.12.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Нет, ничего не перепутал - у меня выдало так
PM MAIL ICQ   Вверх
UnrealMan
Дата 13.12.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Anikmar @  12.12.2006,  22:42 Найти цитируемый пост)
у меня выдало так 

Я от билдера ожидал чего угодно, но только не такое :-) Ибо поступать с точностью до наоборот в отношении константного нуля интегрального и перечислительного типа – это высший пилотаж :-)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1086 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.