| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Двойное преобразование пользовательских типов c++ |
| Автор: vardan 22.5.2013, 16:35 | ||||||
| В правиле 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 22.5.2013, 22:50 | ||||
| Как вариант потому, что автоматическое выведение типа шаблонного параметра из входного аргумента работает только для функций. Хотя нет, в первом случае одно приведение из int в ArraySize, т.е.
не выполняется. Первый случай
Во втором случае не пойму когда происходит первое-второе преобразование при передаче по ссылке. |
| Автор: volatile 23.5.2013, 00:14 |
Если вы эту строку и имели ввиду, и именно это вы и хотели, то да, так не будет работать. нужно писать, например. bool operator==(const Array<int>& lhs, int) {... |
| Автор: NoviceF 23.5.2013, 19:03 | ||||||
Уж не знаю, что хотел сказать автор, но Мэйерс говорит явно не об этом
В этом примере, программист как бы забыл указать индекс у массива а (хотел сравнить массивы поэлементно), и в этом случае, если Array имеет конструктор, позволяющий неявные преобразования, он будет вызван для значения инт, которым является b[i]; Кстати, непонимание автора, видимо, вызвано вот этой деталью (в моём варианте книге так):
|