Вы не должны изменять его в jquery-ui css файл (это может сбивать с толку при изменении файлов по умолчанию) это достаточно, если Вы добавляете
div.ui-datepicker{
font-size:10px;
}
в таблице стилей, загруженной после ui-файлов
, div.ui-datepicker необходим в случае, если ui-виджет упоминается после ui-datepicker в объявлении
Вы выполняете инициализацию копирования, и функции-кандидаты, которые, как считается, выполняют преобразования в последовательности преобразования. - функции преобразования и конструкторы преобразования. Это в вашем случае.
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.
Кажется, MSVS2008 имеет собственное мнение о выборе конструктора: он вызывает конструктор копирования в B независимо от константности оператора A. Так что будьте осторожны, даже если стандарт определяет правильное поведение.
Я думал, что MSVS просто ищет подходящий конструктор перед оператором преобразования, но затем обнаружил, что он начинает вызывать оператор A B (), если вы удалите слово-константу из конструктора B. Вероятно, у него есть какое-то особое поведение для временных файлов, потому что следующий код по-прежнему вызывает конструктор B:
A a;
B b = a;