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

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

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




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


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

Гальванического элемента При контакте двух любых фаз на границе их раздела возникает двойной электрический слой (ДЭС), состоящий из равных по величине, но противоположных по знаку электрических зарядов...

Сущность, виды и функции маркетинга персонала Перснал-маркетинг является новым понятием. В мировой практике маркетинга и управления персоналом он выделился в отдельное направление лишь в начале 90-х гг.XX века...

Разработка товарной и ценовой стратегии фирмы на российском рынке хлебопродуктов В начале 1994 г. английская фирма МОНО совместно с бельгийской ПЮРАТОС приняла решение о начале совместного проекта на российском рынке. Эти фирмы ведут деятельность в сопредельных сферах производства хлебопродуктов. МОНО – крупнейший в Великобритании...

Кран машиниста усл. № 394 – назначение и устройство Кран машиниста условный номер 394 предназначен для управления тормозами поезда...

Приложение Г: Особенности заполнение справки формы ву-45   После выполнения полного опробования тормозов, а так же после сокращенного, если предварительно на станции было произведено полное опробование тормозов состава от стационарной установки с автоматической регистрацией параметров или без...

Измерение следующих дефектов: ползун, выщербина, неравномерный прокат, равномерный прокат, кольцевая выработка, откол обода колеса, тонкий гребень, протёртость средней части оси Величину проката определяют с помощью вертикального движка 2 сухаря 3 шаблона 1 по кругу катания...

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