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

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

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Р,где...

Тема 5. Анализ количественного и качественного состава персонала Персонал является одним из важнейших факторов в организации. Его состояние и эффективное использование прямо влияет на конечные результаты хозяйственной деятельности организации.

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

Патристика и схоластика как этап в средневековой философии Основной задачей теологии является толкование Священного писания, доказательство существования Бога и формулировка догматов Церкви...

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

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