Конструктор Conversion по сравнению с оператором преобразования: приоритет

Вы не должны изменять его в jquery-ui css файл (это может сбивать с толку при изменении файлов по умолчанию) это достаточно, если Вы добавляете

div.ui-datepicker{
 font-size:10px;
}

в таблице стилей, загруженной после ui-файлов

, div.ui-datepicker необходим в случае, если ui-виджет упоминается после ui-datepicker в объявлении

66
задан Jon Seigel 10 April 2010 в 18:32
поделиться

2 ответа

Вы выполняете инициализацию копирования, и функции-кандидаты, которые, как считается, выполняют преобразования в последовательности преобразования. - функции преобразования и конструкторы преобразования. Это в вашем случае.

B(const A&)
operator B() 

Вот как вы их объявляете. Разрешение перегрузки абстрагируется от этого и преобразует каждого кандидата в список параметров, которые соответствуют аргументам вызова. Параметры:

B(const A&)
B(A&)

Второй - потому что функция преобразования является функцией-членом. A & - это так называемый неявный параметр объекта, который ' s генерируется, когда кандидат является функцией-членом. Теперь аргумент имеет тип A . При связывании неявного параметра объекта неконстантная ссылка может привязаться к rvalue. Итак, другое правило гласит, что если у вас есть две жизнеспособные функции, параметры которых являются ссылками, то победит кандидат, имеющий наименьшее количество const квалификации. Вот почему ваша функция преобразования выигрывает. Попробуйте сделать оператор B константной функцией-членом. Вы заметите двусмысленность.

С объектно-ориентированной философской точки зрения, так ли должен вести себя код? Кто знает больше о том, как объект A должен стать объектом B, A или B? Согласно C ++, ответ - A - есть ли что-нибудь в объектно-ориентированной практике, которое предполагает, что это должно быть так? Лично мне это имело бы смысл в любом случае, поэтому мне интересно узнать, как был сделан выбор.

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


Standardese, 8.5 / 14

В противном случае (т.е. для остальных случаев инициализации копирования), user- определенные последовательности преобразования, которые могут преобразовывать исходный тип в целевой тип или (когда используется функция преобразования) в его производный класс, перечисляются, как описано в 13.3.1.4, и лучшая из них выбирается путем разрешения перегрузки (13.3).

И 13.3.1.4

Разрешение перегрузки используется для выбора вызываемого пользователем преобразования. Предполагая, что «cv1 T» является типом инициализируемого объекта, а T - типом класса, функции-кандидаты выбираются следующим образом:

  • Конструкторы преобразования (12.3.1) T являются функциями-кандидатами.
  • Когда тип выражения инициализатора - тип класса "cv S", рассматриваются функции преобразования S и его базовых классов. Те, которые не скрыты внутри S и дают тип, чья cv-неквалифицированная версия имеет тот же тип, что и T, или его производный класс, являются функциями-кандидатами. Функции преобразования, которые возвращают "ссылку на X", возвращают l-значения типа X и, следовательно, считаются выдавшими X для этого процесса выбора функций-кандидатов

В обоих случаях список аргументов имеет один аргумент, который является выражением инициализатора. [Запись: этот аргумент будет сравниваться с первым параметром конструкторов и неявным параметром объекта функций преобразования. ]

И 13.3.3.2/3

  • Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартная последовательность преобразования S2, если [...] S1 и S2 являются ссылочными привязками (8.5.3), а типы, на которые ссылаются ссылки, относятся к тому же типу, за исключением cv-квалификаторов верхнего уровня, а тип, на который ссылается ссылка, инициализированная S2, более квалифицирован cv, чем тип, на который ссылается ссылка, инициализированная S1.
50
ответ дан 24 November 2019 в 15:08
поделиться

Кажется, MSVS2008 имеет собственное мнение о выборе конструктора: он вызывает конструктор копирования в B независимо от константности оператора A. Так что будьте осторожны, даже если стандарт определяет правильное поведение.

Я думал, что MSVS просто ищет подходящий конструктор перед оператором преобразования, но затем обнаружил, что он начинает вызывать оператор A B (), если вы удалите слово-константу из конструктора B. Вероятно, у него есть какое-то особое поведение для временных файлов, потому что следующий код по-прежнему вызывает конструктор B:

A a;

B b = a;
3
ответ дан 24 November 2019 в 15:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: