Главная » Просмотр файлов » Б. Страуструп - Дизайн и Эволюция C++. 2006

Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 91

Файл №1160775 Б. Страуструп - Дизайн и Эволюция C++. 2006 (Б. Страуструп - Дизайн и Эволюция C++. 2006) 91 страницаБ. Страуструп - Дизайн и Эволюция C++. 2006 (1160775) страница 912019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

раздел 15.3), вызовах шаблонов функций (см. раздел 15.6.2), в новых операторах приведения типов (см. разделы 14.2.2 и 4.3) и в специализациях шаблонов (см. раздел 15.10.3). Запрос иа иистаицироваиие выглядит так: Сенр1аке с1аал уесоог<ьпС>; Сетр1аса 1пга уеског<гпг>::орегагог[((ьпп); 'сенр1аае 1пг сопуегг<1пк,оосЫе>(ооцЫе); // класс // член // функция Было решено использовать уже имеющееся ключевое слово Сеп~р1аге, а ие вводить новое — 1пэ с ап с1ас е. Объявление шаблона отличается от запроса иа иистаицироваиие по списку аргументов шаблона: определение шаблона начинается с сеп~р1асе<, а запрос иа инстаипирование — просто с сеп~р1асе. Предпочтение было отдано полностью специфицированной, а ие сокращенной форме вроде: ьэ.'(ОЛ. Явное инстанцирование Перспективным вариантом решения указанных проблем представляется необязательная возможность явного инстаицироваиия.

Это мог бы быть виеязыковой механизм, прагма компилятора или директива в самом языке. С тем или иным успехом опробовались все эти способы. Меньше всего из иих мие нравится ((ргасппа. Если уж нам нужен в языке механизм явного инстаицироваиия, то оп должен быть общедоступеп и иметь четко определенную семантику. От необязательного оператора ипстаццироваиия получим следующие преимушества: Шаблоны БИИИИИИН: // не С++ Севр1але неслог<ьпл>::орегалог[!; // член севр1асе сопчегл<1пс,<[опЫе>/ // 4ункцня Данное решение позволяет избежать неоднозначностей для перегруженных шаблонов функций и дает компилятору некоторую избыточную информацию, чтобы он мог выполнить проверки на непротиворечивость.

Кроме того, запросы на инстанцирование встречаются достаточно редко, так что излишне лаконичная запись не очень нужна. Однако при вызовах шаблонов функций можно опускать аргументы шаблона, которые выводятся из фактических параметров функции (см. раздел 15.6.1). Например: севр1асе ьпс сопчегс<1пс>(с[опо1е[; // 4ункция Если шаблон класса ннстанцируется явно, то инстанцируется н каждая его функция-член (см. раздел 15.10А). Отсюда следует, что явное инстанцирование можно использовать для проверки ограничений (см. раздел 15.4.2). Инстанцирование по запросу позволяет существенно снизить время компоновки и число повторных компиляций.

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

Именно это и послужило первоначальным доводом против включения оператора явного инстанцирования. С другой стороны, подавление лишнего явного инстанцирования в обычной ситуации может оказаться очень трудной задачей. По вышеуказанному вопросу комитет решил дать свободу разработчикам компиляторов: множественное инстанцирование диагностировать необязательно.

Это позволяет сложному компилятору игнорировать лишние инстанцирования и тем самым решить вышеупомянутую проблему составления программы из библиотечных модулей. Однако компилятор не всегда бывает настолько «умнымю Пользователи более простых компиляторов должны самостоятельно избегать множественного инстанцирования, но даже в самом худшем случае программа просто не будет загружаться; незаметно для пользователя семантика не изменится. Как и раньше, язык не требует инстанцировать шаблон явно.

Явное инстанцирование — всего лишь оптимизация процесса компиляции и компоновки вручную. 15. 10.2. Точка инстанцироаания Самый трудный аспект определения шаблонов — точное указание, к каким объявлениям относятся имена, использованные в определении шаблона. Часто это называют проблемой привязки имен. Описываемые здесь пересмотренные правила привязки имен — плод многолетнего труда разработчиков, в особенности членов рабочей группы по расширениям— Инстанцирование шабяонов 1ФИИИИЕП Эндрю Кенига,Мартина О'Риордана, Джонатана Шопиро.

К моменту принятия (ноябрь 1993 г., Сан-Хосе) правила уже были всесторонне испытаны на практике. Рассмотрим пример: ()1пс1пс)е <1оаттеав.Ь> ()1по1пое <чеотот.Ь> чо1с) оЬ(СопЬ1е); //() 1 тевр1ате<с1ааа Т> Т апв(нестот<Т>а ч) ( та=о; тот (1пт т = О; 1<ч.аьте(); та<) т = т > ч(т); 11 (ьввцо) ( сопт « "сумма равна " « г.

« '1п'; с)ь(т); с)Ь(1); ) тетитп т; ()1пс1пое <оовр1ех.Ь> //()2 чоЫ 1(неотот<совр1ех>а ч) ( совр1ех с = апв(ч)р ) В первоначальном определении говорилось, что любые имена, встречающиеся в шаблоне, привязываются в точке инстанцирования, она находится прямо перед глобальным объявлением, в котором шаблон используется в первый раз (в примере выше — () 2). У этого определения есть, по меньшей мере, три нежелательных свойства: о в точке определения шаблона ничего нельзя проверить.

Например, если оьв(то в этой точке не определено, то не будет выдано сообщение об ошибке; о могут быть найдены и использованы имена, объявленные после определения шаблона. Часто, но не всегда это является неожиданностью для пользователя, читающего определение шаблона. Например, естественно ожидать, что вызов стЬ (1) будет разрешен в пользу объявленной выше функции с)Ь(стопЬ1е), но если фрагмент... содержит объявление с)Ь(1пг), то в соответствии с общими правилами перегрузки используется именно с)Ь (1пС ) . С другой стороны, если в файле совр1ех.

Ь определена функция с)Ь (совр1ех), мы бы хотели, чтобы вызов дЬ (с ) был разрешен в пользу дЬ ( согар1 ах ), а не признан ошибкой из-за того, что он является некорректным вызовом функции с)Ь (с(оцЬ1е), видимой в определении шаблона; о множество имен, видимых в точке инстанцирования, различается, когда зпв используется в двух разных компиляциях. Если э ив (нес с от< совр1ех>а ) Шаблоны ИЗИИИИИ1Г при атом получает два разных определения, то результирую)цая программа незаконна с точки зрения правила одного определения (см, раздел 2.5). Однако в таких случаях проверить выполнение правила одного опрелелсння не под силу традиционному компилятору С++.

Ко всему прочему в оригинальном правиле не учтен случай, когда определение шаблона функции не находится в данной единице трансляции. Например: сежр1асе<о1азз т> т зов(чесгог<т>а ч); $1пс1иое <оопр1ех.п> // «2 чога Т(чеооог<сомр1ех>а ч) ( сожр1ех о = за(ч)) ) Ни разработчики компилятора, ни пользователи не получали указаний ца то, как искать определения шаблонов функции з)па ( ) . Г!озтому в компиляторах применялись разные стратегии, Общая проблема состоит в том, что в инстанцировании шаблона участвуют три контекста и четко разделить их нельзя: ш контекст определения шаблона; (з контекст объявления типа аргумента; я контекст использования шаблона. Основная цельпроектирования шаблонов — гарантировать наличие достаточного объема информации при определении шаблона, чтобы его разрешалось ннстанцировать по фактическим аргументам, не полагаясь на «случайные» обстоятельства, сложившиеся в точке вызова.

В первоначальном проекте делалась попытка обеспечить разумное поведение, полагаясь исключительно на правило одного определения Гсм. раздел 2.5). Считалось, что если случай и повлияет на определение сгенерированной функции, то обстоятельства вряд ли будут склалываться одинаково при любом использовании шаблона функции. Предположение обоснованное, но компиляторы обычно не выполняют проверку на непротиворечивость Ги тому есть веские причины). Так или иначе, грамотно написанные программы работают. Но желающие использовать шаблоны как макросы могут написать такую программу, которая будет извлекать нежелательные, на мой взгляд, преимущества из контекста вызова. Кроме того, у разработчика компилятора возникают серьезные трудности, когда он хочет синтезировать контекст для определения функции, чтобы ускорить инстанцирование.

Уточнить понятие точки инстанцирования так, чтобы оно было лучше исходного и одновременно сохраняло работоспособность написанных программ, было необхолимо, хотя и непросто. Инстанцирование шаблонов 1ИИИИИИФИП а зависящие от аргументов шаблона; ы все остальные. Последние можно привязать в контексте определения шаблона, а первые— в контексте инстанцировапия. Данная концепция це имеет изъянов, если только удастся четко опрелелить, что обозначает фраза зависит от аргументов шаблона».

15. 10.2.1. Определение зависимости от Т Фраза азависит от аргумента шаблона т», вероятно, может обозначать »является членом т». Если т — встроенный тип, то встроенные операторы будут считаться членами. К сожалению, этого недостаточно. Вот пример: с1ааа сотр1ех ( II Гггеад соар1ех орегасог» (совр1ох, сотр1ех(; соар1ех(с(оио1е(; Чтобы этот пример работал, в определение азависимости от аргумента шаблона т» надо включить, по крайней мере, друзей т.

Но и этого мало, поскольку ответственные функции, нс являющиеся членами, не обязательно должны быть дружественными: с1ааа ооар1ех ( 11 совр1ех орегасог»=(соир1ех(; соар1ех(ооиЫе(; 1 соар1ех орегаоог»(сотр1ех а, ооар1ех 'о( ( сотр1ех г = а; гесога г»=Ь; Сначала мы решили потребовать, чтобы каждое встречающееся в шаблоне имя определялось в точке опрелеления шаблона. При этом шаблон стал бы лсгко читаться, появилась бы гарантия, что при ипстапцировании не будет выбрано ничего случайного, а кроме того, обеспечивалось бы раннее обнаружение ошибок. Но это не позволило бы шаблону применять операции к объектам собственного класса.

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

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

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

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