Студопедия — R.13.2 Сопоставление параметров
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

R.13.2 Сопоставление параметров






При вызове функции с данным именем происходит выбор из всехфункций с этим именем, которые находятся в текущей области видимости, идля которых существуют преобразования типа, делающие вызов возможным.Выбирается та функция, которая наиболее соответствует фактическимпараметрам. Она находится в области пересечения множествфункций, каждое из которых наиболее соответствуют вызову по данномуфактическому параметру. Операция вызова считается допустимой, если в этомпересечении находится только один член. Функция, выбранная таким образом,должна более любой другой функции с тем же именем соответствоватьвызову, хотя бы по одному из параметров (необязательно этобудет один и тот же параметр для разных функций). В противном случае,вызов считается недопустимым. При сопоставлении параметров рассматривают функцию с числомстандартных значений параметров ($$R.8.2.6), равным n, какn+1 функций с различным числом параметров. При сопоставлении параметров нестатическую функцию-членрассматривают как функцию, имеющую дополнительный параметр,указывающий на объект, для которого вызывается функция. Этотдополнительный формальный параметр должен сопоставляться илис объектом, или с указателем на объект, заданными в явной операциивызова функции-члена ($$R.5.2.4), или же с первым операндомперегруженной функции operator ($$R.13.4). Для этого дополнительногопараметра не используется никаких временных объектов, а для достижениясопоставления не производится никаких пользовательских преобразованийтипа. Если явно вызывается член класса X, используя указатель и операцию->, то считается, что дополнительный параметр имеет тип const* X длячленов типа const, volatile* X для членов типа volatile иX* для всех остальных членов. Если явно вызывается функция-член,используя объект и операцию., а также, если вызывается функциядля первого операнда перегруженной функции operator ($$R.9.4),то считается, что дополнительный параметр имеет тип: const X& длячленов типа const, volatile X& для членов типа volatile и X&для всех остальных членов. Первый операнд для ->* и.* рассматриваетсятак же, как и первый операнд для -> и. соответственно. Эллипсис в списке формальных параметров ($$R.8.2.5) можетсопоставляться с фактическим параметром любого типа. Для данного фактического параметра допускается только такаяпоследовательность преобразований типа, которая содержит не болееодного пользовательского преобразования. Ее нельзя сократить,исключив одно или несколько преобразований, до последовательности,которая также приводит к типу, сопоставимому с типом рассматриваемогоформального параметра. Такая последовательность преобразованийназывается наиболее соответствующей последовательностью. Например, последовательность int->float->double задаетпреобразование int в double, но ее нельзя назвать наиболеесоответствующей последовательностью, поскольку в ней содержитсяболее короткая последовательность int->double. Кроме описанных ниже случаев, следующие тривиальныепреобразования типа T не влияют на свойство последовательностибыть наиболее соответствующей: исходный тип тип результата T T& T& T T[] T* T(параметры) T(*)(параметры) T const T T volatile T T* const T* T* volatile T* Последовательности тривиальных преобразований, которые отличаютсятолько порядком преобразований, считаются совпадающими. Отметим,что для функций с формальным параметром типа T, const T, volatile T,T&, const T& и volatile T& допустим фактический параметр из одно итого же множества значений. При необходимости для разделенияпоследовательностей преобразований используются спецификации const иvolatile, как описано в правиле [1] ниже. Для формального параметра типа T& требуется временная переменнаяв случаях, если: фактический параметр не является адресом, или имеет тип,отличный от T, в том числе тип volatile. Наличие такой переменнойне влияет на сопоставление параметров. Однако, оно может повлиятьна допустимость результата сопоставления, т.к. временную переменнуюнельзя использовать для инициализации ссылок, не являющихсяconst ($$R.8.4.3). Последовательности преобразований рассматриваются согласноследующим правилам: [1] Точное сопоставление. Последовательности из нуля или более тривиальных преобразований предпочтительнее любых других последовательностей. Из более сложных последовательностей наиболее предпочтительны те, в которых нет преобразований T* в const T*, T* в volatile T*, T& в const T& или T& в volatile T&. [2] Сопоставление со стандартными преобразованиями основных типов. Из последовательностей, не относящихся к [1], наиболее предпочтительны те, которые содержат только стандартные целочисленные преобразования ($$R.4.1), преобразования float в double и тривиальные преобразования. [3] Сопоставление с любыми стандартными преобразованиями. из последовательностей, не относящихся к [2], наиболее предпочтительны те, которые содержат только любые стандартные преобразования ($$R.4.1, $$R.4.2, $$R.4.3, $$R.4.4, $$R.4.5, $$R.4.6, $$R.4.7, $$R.4.8) и тривиальные преобразования. Для этих последовательностей если A является прямым или косвенным общим базовым для класса B, то преобразование B* в A* предпочтительнее преобразования B* в void* или const void*. Далее, если B является прямым или косвенным базовым классом для C, то предпочтительнее преобразование C* в B*, чем C* в A*, и предпочтительнее преобразование C& в B&, чем C& в A&. Иерархия классов выступает здесь критерий отбора преобразований указателя в член ($$R.4.8). [4] Сопоставление с пользовательскими преобразованиями. Из последовательностей, не относящихся к [3], наиболее предпочтительны те, которые содержат только пользовательские ($$R.12.3), стандартные ($$R.4) и тривиальные преобразования. [5] Сопоставление с эллипсисом. Последовательности, которые требуют сопоставления с эллипсисом, считаются наименее предпочтительными. Пользовательские преобразования выбирают, исходя из типапеременной, которая инициализируется или которой присваиваетсязначение. class Y { //... public: operator int(); operator double(); }; void f(Y y) { int i = y; // вызов Y::operator int() double d; d = y; // вызов Y::operator double() float f = y; // ошибка: неоднозначность } Стандартные преобразования ($$R.4) могут применяться к параметру,как до пользовательского преобразования, так и после него. struct S { S(long); operator int(); }; void f(long), f(char*); void g(S), g(char*); void h(const S&), h(char*); void k(S& a) { f(a); // f(long(a.operator int())) g(1); // g(S(long(1))) h(1); // h(S(long(1))) } Если для параметра требуется пользовательское преобразование, то неучитываются никакие стандартные преобразования, которые могутзатрагивать этот параметр, например: class x { public: x(int); }; class y { public: y(long); }; void f(x); void f(y); void g() { f(1); // неоднозначность } Здесь вызов f(1) неоднозначен. Несмотря на то, что для вызоваf(y(long(1))) требуется на одно стандартное преобразование больше,чем для вызова f(x(1)), второй вызов не является предпочтительным. Преобразования с помощью конструктора ($$R.12.1) и с помощьюфункции преобразования ($$R.12.3.2) равноправны. struct X { operator int(); }; struct Y { Y(X); }; Y operator+(Y,Y); void f(X a, X b) { a+b; // ошибка, неоднозначность: // operator+(Y(a), Y(b)) или // a.operator int() + b.operator int() }







Дата добавления: 2015-09-04; просмотров: 311. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Постинъекционные осложнения, оказать необходимую помощь пациенту I.ОСЛОЖНЕНИЕ: Инфильтрат (уплотнение). II.ПРИЗНАКИ ОСЛОЖНЕНИЯ: Уплотнение...

Приготовление дезинфицирующего рабочего раствора хлорамина Задача: рассчитать необходимое количество порошка хлорамина для приготовления 5-ти литров 3% раствора...

Дезинфекция предметов ухода, инструментов однократного и многократного использования   Дезинфекция изделий медицинского назначения проводится с целью уничтожения патогенных и условно-патогенных микроорганизмов - вирусов (в т...

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия