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

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

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; просмотров: 343. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


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


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


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...

Индекс гингивита (PMA) (Schour, Massler, 1948) Для оценки тяжести гингивита (а в последующем и ре­гистрации динамики процесса) используют папиллярно-маргинально-альвеолярный индекс (РМА)...

Методика исследования периферических лимфатических узлов. Исследование периферических лимфатических узлов производится с помощью осмотра и пальпации...

Травматическая окклюзия и ее клинические признаки При пародонтите и парадонтозе резистентность тканей пародонта падает...

Подкожное введение сывороток по методу Безредки. С целью предупреждения развития анафилактического шока и других аллергических реак­ций при введении иммунных сывороток используют метод Безредки для определения реакции больного на введение сыворотки...

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

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