![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
vardan |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 18.7.2011 Репутация: нет Всего: нет |
В правиле 5 книги С. Майерса " Наиболее эффективное использование C++. 35 новых рекомендаций" приводится пример преобразования типов. Там говорится что "Ранее я упоминал, что правила, по которым определяется, какие последовательности неявного преобразования типа корректны, а какие нет, довольно сложны. Одно из этих правил состоит в том, что последовательность преобразований не может содержать более одного преобразования, определенного пользователем (то есть вызова конструктора с единственным аргументом или оператора неявного преобразования типа)."
Есть класс класс Array и встроенный класс ArraySize
и создается объект таким образом
в книге говорится что в этом случае компилятор преобразует аргумент типа int во временный объект ArraySize поскольку ArraySize именно то что нужно Array<int>. Но во время вот этой операции
говорится что компилятор не может преобразовать во временный объект ArraySize а затем создать необходимый объект Array<int> из временного потому что это потребует вызова двух преобразований определенных пользователем: из int в ArraySize и из ArraySize в Array<int>. Такая последовательность преобразований запрещена, поэтому при попытке выполнить сравнение компиляторы сгенерируют ошибку. Вопрос в том чем отличается случай с Array<int>a(10); когда преобразование успешно выполняется от случая в теле операторa operator==(const Array<int>& lhs, const Array<int>& rhs) когда компилятор не выполняет преобразование. В обоих случаях та же схема из int -а в ArraySize и из ArraySize в Array<int>. Спасибо |
||||||
|
|||||||
Result |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 15.5.2011 Репутация: 2 Всего: 5 |
Как вариант потому, что автоматическое выведение типа шаблонного параметра из входного аргумента работает только для функций.
Хотя нет, в первом случае одно приведение из int в ArraySize, т.е.
не выполняется. Первый случай
Во втором случае не пойму когда происходит первое-второе преобразование при передаче по ссылке. Это сообщение отредактировал(а) Result - 22.5.2013, 23:44 |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ничем не отличаецца. скорей всего ошибка где-то в другой строке, например здесь. Либо вы не корректно привели отрывок кода. (по крайней мере, смысла внутри оператор== , я пока не вижу что-то...) |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
NoviceF |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
Уж не знаю, что хотел сказать автор, но Мэйерс говорит явно не об этом ![]()
В этом примере, программист как бы забыл указать индекс у массива а (хотел сравнить массивы поэлементно), и в этом случае, если Array имеет конструктор, позволяющий неявные преобразования, он будет вызван для значения инт, которым является b[i]; Кстати, непонимание автора, видимо, вызвано вот этой деталью (в моём варианте книге так):
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |