![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Всем привет!
На ИРКе задали такой вопрос: как заставить работать шаблонную версию
http://liveworkspace.org/code/c604f09278a1...04bacd89ad94f5c Ответ меня несколько обескуражил:
http://liveworkspace.org/code/44b1abd0c724...c498ad7c8681910 Можете объяснить, каким образом volatile не даёт работать второй ф-ции, когда вызывается size("foo"); ? Спасибо. P.S. ИРКа англоязычная, и выяснять там сложнее, чем на великом и могучем P.P.S. Интересно услышать мнение тёзки сабжа Это сообщение отредактировал(а) borisbn - 9.10.2011, 15:05 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
borisbn
Точно также, как и любой другой квалификатор. Компилятор не находит более подходящую перегрузку и вызывает ее. Конкретно в твоем примере при первом вызове срабатывает версия с массивом, так-как "foo" это массив символов, а во втором случае тип const char*. volatile просто делает перегрузку менее подходящей для вызова. Хотя на самом деле я сильно сомневаюсь в правильности такого решения. И вообще volatile не для того создан. Это сообщение отредактировал(а) azesmcar - 9.10.2011, 15:33 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
то, что рейтинг функции с const char * стал меньше для выбора - я понял. Не понял как на это повлиял volatile
однозначно, решение какое-то ...мммм... странное. Я бы его не использовал. Просто стало интересно и захотелось разобраться почему так происходит Это сообщение отредактировал(а) borisbn - 9.10.2011, 16:10 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Все-же, формально, это не совсем массив символов. Потому-что если явно задать массив, то волатайл не нужен. http://liveworkspace.org/code/9ad72a5df592...e639ea8a02245ad Все эти приоритеты при неявном приведении, тёмная сторона С++. имхо, и еще раз имхо... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
формально говоря, это совсем не массив символов |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
и всё же... каким образом этот
попадает в ф-цию, ожидающую массив символов, если к указателю добавить volatile? не понимаю -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
mes, а что это? borisbn, мой пример не совсем корректный. я там забыл const поставить. А если его поставить, то все меняется... http://liveworkspace.org/code/abfc4931bd80...7ed845d79a235e1 |
|||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Короче, открыл щаз студию.
Код:
MS VC2008 выход:
gcc (liveworkspace.org) выход:
На лицо явно баг! Но чей?, кто из них врёт? Здесь явно не может быть "имплементейшн дефайнед" Это сообщение отредактировал(а) volatile - 9.10.2011, 23:56 |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, Ваш код из первого поста http://liveworkspace.org/code/44b1abd0c724...c498ad7c8681910
На студии также ведет себя не так как gcc студия выход:
Добавлено через 4 минуты и 11 секунд Вообще, мое мнение такое (и пусть меня закидают помидорами). Шаблонная функция всегда, по правилам С++, имеет меньший приоритет перед явной. Посему - это всего лишь баг gcc, и волотайл, здесь не спасет... (могу ошибаться) |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Кроме того,
gcc: cpointer pointer cpointer Закомментарить void size(char* arr) cpointer rarray 4 cpointer В size(const char arr[N]) - никогда не попадаем Это сообщение отредактировал(а) math64 - 10.10.2011, 08:23 |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
квалификатор volatile как и const является частью сигнатуры функции и участвует в выборе перегрузки (или как там переводиться overload resolution?).
Добавлено через 1 минуту и 30 секунд cv- qualifiers - это const volatile квалификаторы (если что |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |