387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
||||||||||||||||
1 | ||||||||||||||||
Непонятки с конвертацией типов01.07.2012, 20:27. Показов 1770. Ответов 13
Метки нет (Все метки)
Краткое описание примера. Определен класс Foo, единственное поле которого -- константная ссылка (const std::string &).
В классе определены лишь конструктор с сигнатурой Foo(const std::string &) и оператор конвертации обратно в константную ссылку на строку.
Теперь вопросы:
0
|
01.07.2012, 20:27 | |
Ответы с готовыми решениями:
13
Проблема с конвертацией. Ошибка с конвертацией? Проблемы с конвертацией скриптов Проблема с конвертацией в Excel |
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
||||||
01.07.2012, 20:48 | 2 | |||||
Ну ведь
- это явное приведение, ответственнонсть за последствия уже не на компиляторе. С неявным так не выйдет:
1
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
|
01.07.2012, 21:01 [ТС] | 3 |
а я почему-то был уверен, что явное приведение типов ограничивается только возможностями static_cast и reinterpret_cast, которые константность менять не могут. но сейчас проверил, оказалось, что я ошибался.
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
01.07.2012, 21:13 | 4 |
По моему лучше вообще не пользоваться C-style cast в C++, как минимум, так константность можно снять только с помощью const_cast .
0
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
||||||
01.07.2012, 21:22 [ТС] | 5 | |||||
походу возник еще один вопрос
допустим, мы хотим писать
Результат компиляции Ну и если добавить в класс Foo operator float(), то все действительно без проблем компилируется: http://liveworkspace.org/code/... 3fbd4dd823 Но вот непонятно, почему компилятору не видна версия operator<< для строк. Ведь такая версия есть. Можно было бы предположить, что оператор << для строк объявлен как шаблонная ф-ция, не имеющая общего определения, но имеющая только специализации для конкретных типов, но тогда бы ошибка была бы другой, что-то вроде undefined reference to...
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
03.07.2012, 16:51 | 6 | |||||
yekka, Видна.
Добавлено через 33 минуты http://liveworkspace.org/code/... ec99f77a97 Вообщем довольно странный расклад. Он не может конвертнуть к шаблонному типу, почитаю стандарт поищу, в разделе 12.2.3 про это ничего нет. Может и gcc косячит. Добавлено через 2 часа 14 минут Расклад такой. http://stackoverflow.com/quest... -operators Добавлено через 11 минут Итого для работы того кода достаточно сделать так.
2
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
|
03.07.2012, 18:53 [ТС] | 7 |
когда перекрываются перегруженные функции, шаблонные функции и их специализации, получается крайне неочевидные результаты
статья в тему -- http://www.gotw.ca/publications/mill17.htm
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
03.07.2012, 19:20 | 8 |
yekka, В представленном выше коде нет никаких специализаций и неочевидного ничего здесь нет, ибо в варианты попадают все операторы <<, объявленные в хедер-файлах в области видимости пространства имен std + глобальная область видимость, в std есть оператор вывода для string, но он шаблонный, в глобальной же области видимости оператор не шаблонный, следовательно он и выбирается.
0
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
|
03.07.2012, 22:45 [ТС] | 9 |
Тем не менее, не понятно, почему в случае http://liveworkspace.org/code/... ee6adf3e81 бьется память, а, казалось бы, аналогичный вариант с const_cast и static_cast http://liveworkspace.org/code/... 13a51ba7a3 исправно работает? Как выяснилось, первом случае генерится код с точностью до хеша совпадающий с вот этим вариантом, использующим const_cast и reinterpret_cast: http://liveworkspace.org/code/... d42d069f0d Остается только разобраться, почему здесь компилятором используется reinterpret_cast, а не static_cast
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
04.07.2012, 00:12 | 10 |
yekka, Я про последний свой код говорил)
0
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
|
04.07.2012, 07:42 [ТС] | 12 |
ну так об том и речь. в данном случае вполне достаточно static_cast'а, но компилятор почему-то использует reinterpret_cast
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
04.07.2012, 12:40 | 13 |
yekka, потому что не надо, как уже говорили, использовать каст в С-стиле.
0
|
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
|
|
05.07.2012, 20:55 [ТС] | 14 |
Не по теме: ну если нечего сказать по делу, то зачем же флудить-то? что-то не могу понять. с одной стороны, стандарт явно утверждает, что при c-style приведении типов комбинация const_cast + reinterpret_cast должна использоваться только в том случае, когда const_cast + static_cast не справляются. с другой стороны, и gcc, и clang в данном случае (http://liveworkspace.org/code/... ee6adf3e81) используют reinterpret_cast
0
|
05.07.2012, 20:55 | |
05.07.2012, 20:55 | |
Помогаю со студенческими работами здесь
14
Проблемы с конвертацией из 97 в 2000 access ... Проблема с конвертацией textbox на 20-й строчке Проблемы с конвертацией Mime в Richtext Затруднения с конвертацией html в Wordpress Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |