Главная » Просмотр файлов » Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)

Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769), страница 90

Файл №1160769 Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)) 90 страницаД. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769) страница 902019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 90)

В нашем примере есть две точки инстанцирования функции Му)з11д)тс<Со1ог>, однако они дают различное связывание имени ра1пс. Следомтельно, программа некорректна. Приложение Б Разрешение перегрузки Разрешение нереерузки — это процесс выбора функции, к которой обращается выражение вызова. Рассмотрим простой пример. чей 61вр1ау пша(1пг.); // (1) чо16 с)1вр1ау ппшИоп)э1е)з// (2) 1пс ша1п() ( с)1вр1ау пша(399); 61вр1ау ппш(3.99); ) // соответствует (1) лучше, чем (2) // соответствует (2) лучше, чем (1) Принято говорить, что в этом примере имя функции с)1вр1ау пша() нерезрушсиееся.

Когда это имя используется в вызове, компилятор С++ должен выбирать вызываемую функцию среди различных кандидатов с использованием дополнительной информации, главным образом о типах аргументов вызова В нашем примере интуиция подсказывает целесообразность вызова 1пс-версии, когда функция вызывается с целочисленным аргументом, и с)оп)э1е-версии, когда используется аргумент с плавающей точкой. Формальный процесс попытки моделирования этого интуитивного выбора — это и есть процесс разрешения перегрузки. Общие идеи, лежащие в основе принципов, регулирующих разрешение перегрузки, достаточно просты.

Однако подробности нх реализации значительно усложнились в процессе стандартизации С++. Эта сложность — в основном результат желания обеспечить поддержку реально существующих примеров, которые интуитивно кажутся человеку "наилучшим выбором". Однако при формализации такого интуитивного выбора возникают различные тонкости. В этом приложении достаточно подробно рассматриваются правила разрешения пеРегрузки. Однако этот процесс настолько сложен, что мы не можем претендовать на полноту охвата данной темы. Приложение Б.

Разрешение перегрузки 506 Б.1. Когда используется разрешение перегрузки Разрешение перегрузки — это только одна часть процесса обработки вызова функции. В действительности разрешение перегрузки не является частью любого вызова функции. Во-первых, для вызовов с помощью указателей и вызовов с помощью указателей на функции-члены не требуется разрешения перегрузки, поскольку вызываемая функция полностью определена (во время работы программы) с помощью указателей. Во-вторых, макросы функционального типа нельзя перегружать, поэтому они не попадают под действие разрешения перегрузки.

На очень высоком уровне вызов именованной функции может быть обработан следующим образом. ° Имя образует начальный набор перегрузки. ° При необходимости этот набор может быть уточнен различными способами (например, путем вывода шаблонов). ° Любая ф)/нкция-кандидат, которая совсем не соответствует вызову (даже после учета неявных преобразований и аргументов по умолчанию), удаляется из набора перегрузки.

В результате формируется набор так называемых жизнеспособных функций-кандидатов. ° Для поиска наилучшего кандидата выполняется разрешение перегрузки. Если таковой есть, выбираем его; в противном случае исход вызова неоднозначен. ° Проверяется выбранный кандидат (например, если это закрытый член, выводится соответствующая диагностика). Каждый из этих шагов имеет свои тонкости, однако можно утверждать, что разрешение перегрузки — самый сложный из них. К счастью, несколько простых принципов позволяют прояснить большинство ситуаций. Далее эти принципы бул)т подробно рассмотрены. Б.2.

Упрощенное разрешение перегрузки Разрешение перегрузки располагает жизнеспособные функции-кандидаты по рангу путем сравнения того, насколько каждый аргумент выэова совпадает с соответствующим параметром кандидата. Один из кандидатов лучше другого, если любой из его параметров соответствует вызову не хуже, чем соответствующий параметр другого кандидата. Данный подход можно проиллюстрировать приведенным ниже примером. чоМ. сомЬзпе(1пс, г)опЬ1е)г иоЫ сомЬзпе(1опс, зпь); зпС мазп() ( соаЬзпе(1, 2); // Неоднозначность! Б.2.

Упрощенное разрешение перегрузки 507 ° Точное соответствие. Тип параметра совпадает с типом выражения, или его тип является ссылкой на тип выражения (возможно, с добавлением спецнфикаторов сопле и/иличо1ас11е). ° Соответствие, достигаемое минимумом настроек. Включает, например„сведение переменной массива к указателю на его первый элемент или добавление специфнкатора сопев для обеспечения соответствия аргумента типа 1пс** параметру типа 1пс сопле* сопле*.

° Соответствие, достигаемое продвижением (ргопюбоп) типа. Продвижение — это вид неявного преобразования, которое включает преобразование меньших интегральных типов (таких, как Ьоо1, сЬаг, зЬогс, и иногда перечислимых типов) в тип 1пг, цпзйдпед 1пс, 1опд или ипзйдпес) 1опд, а также преобразование типа й1оаг в тип с)оиЬ1е. ° Соответствие, достигаемое за счет спшдартного преобразования. Оно включает любой вид стандартного преобразования (например, типа 1пс в тип Е1оаг), но исключает неявное обращение к оператору преобразования или конструктору преобразования. ° Соответствие за счет преобразования, определяемого пользователем. Позволяет выполнять любой тип неявного преобразования. ° Соответствие за счет многоточия (...

) в объявлении функции. Параметр, подставляемый на место многоточия, может совпадать почти с любым типом (однако классы, не являющиеся простыми типами данных, приводят к непредсказуемому поведению). Приведенный ниже запуганный пример иллюстрирует некоторые из этих соответствий. 1пг б1(1пг)г // (1) 1пс й1(доиЬ1е); // (2) й1(4); // Вызов (1): точное соответствие // ((2) требует стандартного преобразования) 1пс Е2(1пс); 1пс б2(сЬаг); б2(сгпе); // (3) // (4) // Вызов (3): соответствие с // пролвижением типа // ((4) требует более строгого // стандартного преобразования) В этом примере вылов созЬ1пе () неоднозначен, поскольку первый кандидат лучше соответствует первому аргументу (литерал 1 типа 1пс), тогда как второй кандидат лучгле соответствует второму аргументу.

Можно утверждать, что йпс в некотором смысле ближе к 1опд, чем к г)опЬ1е (который поддерживает выбор в пользу второго кандидата). Однако С++ не пытается определить меру близости для нескольких аргументов вызова. Для этого принципа необходимо указать, насколько хорошо данный аргумент совпадает с соответствующим параметром жизнеспособного кандидата. В первом приближении возможные соответствия можно располомсить по рангу (от лучшего к худшему), как описано ниже. Приложение Б. Разрешение перегрузки 508 Отметим, что разрешение перегрузки осуществляется после вывода аргумента шаблона, и этот вывод не учитывает все перечисленные вилы преобразований.

Проиллюстрируем это на примере. Еешр1аее <Сурепаше Т> с1авв МуЯСг1пд ( ри)з11сз МуЯсг1пд(Т сопве*)З // Конструктор преобразования Сешр1аее<еурепаше Т> МуЯег1пд<т> азцпсасе(муясгепд<т> сопвса, 1пс) з 1пе ша1п() ( МуЯсг1пд<с)заг> втг1, всг2з всг1 = сгппсасе<с)заг>("Не11о Мог16", 5); // ОК всг2 = сгипсаее("не11о Мог16", 5); // Ошибка ) Неявное преобразование, предусмотренное в конструкторе преобразования, не учитывается при выводе аргумента шаблона Инициализация всг2 не обнаруживает жизнеспособной функции сгзлзсасе ( ), так что разрешение перегрузки не выполняется вообще. Изложенные принципы — это только первое приближение, но они охватывают очень много случаев. Однако имеется ряд распространенных ситуаций, которые нельзя адекватно обьяснить этими правилами. Далее кратко обсуждаются самые важные уточнения этих правил.

Б.2.1. Неявный аргумент для функций-членов Вызовы нестатических функций-членов имеют скрытый параметр, доступ к которому возможен в определении функции-члена как *с)з1в. Для функции-члена класса муС1авв скрытый параметр обычно бывает типа муС1авза (для функций-членов типа от- с1авв Х ( риЫ1с з Х ( 1пс); ); 1пс йз (Х); 1пс ЙЗ(...)з ЕЗ(7)з //(5) //(б) // Вызов (5)з соответствие за счет // пользовательского преобразования // ((6) требует соответствия // за счет многоточия) Б.2. Упрощенное разрешение перегрузки личного от сопвг) или )ЧуС1авв сопвсй (для функций-членов типа сопяТ) .

Несколько удивляет то, что с]з1в имеет тип указателя. Лучше было бы сделать его э)шивалентным параметру, который сейчас определен как *с)зхв. Однако он был часп ю первых версий языка С++ еше до того, как в нем появился ссылочный тип данных. К моменту введения этого типа данных было уже написано слишком много кода, который зависел от параметра г)ззв, являющегося указателем. Скрытый параметр *с]ззв принимает участие в разрешении перегрузки точно так же, как и явные параметры. Почти всегда это вполне естественно, но иногда — неожиданно. В следующем примере приведен строковый класс, который работает не так, как ожидалось (такой код приходится видеть и в реальной жизни).

йхпс1ис)е <иудей.)з> с1азв Вас)Ясг1пд ( рп)э11с: ВабЯШпд(с)заг сопла*)а // Доступ к символу через индексацию с)загй орегасог [] (вхке г) > // (1) с)таг солись орегасог(](взке г) сопзс; // Неявное преобразование в С-строку орегагог с)заг* (); орегасог с)заг сопвс* (); зпг шазп() ( Вас]ЯСг1пд вгг(асоггеКК"); лег[5] = 'с'> // Возможна неоднозначность // разрешения перегрузки! Вначале кажется, что а выражении всг(5) нет ничего неоднозначного. Оператор индексации в строке (1) выглядит совершенно корректно.

Однако зто не совсем так, поскольку аргумент 5 — это тип зпг, а оператор ожидает целое число без знака (вйяе с и зМ::взхе Г обычно имеюттип ипзздпес) 1пг илиипзздпес) 1опд, но никогда не 1пс). При этом простое стандартное преобразование целочисленного типа легко делает (1) жизнеспособным. Вместе с тем есть и другой жизнеспособный кандидат: встроенный оператор индексации. Действительно, если применить оператор неявного преобразования к типу вгг (который является неявным аргументом функции-члена), получится указатель. И теперь можно применять встроенный оператор индексации.

Характеристики

Тип файла
DJVU-файл
Размер
5,6 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее