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

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

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 кг мяса...


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


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Тема: Изучение фенотипов местных сортов растений Цель: расширить знания о задачах современной селекции. Оборудование:пакетики семян различных сортов томатов...

Тема: Составление цепи питания Цель: расширить знания о биотических факторах среды. Оборудование:гербарные растения...

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

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

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

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

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