|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
пытаюсь понять в чем разница преобразований скажем reinterpret_cast и static_cast . выходит разница все же есть. вот этой программой пытаюсь расщепить число float (или double) на составляющие мантиса, степень... так вот reinterpret_cast все выходит, а static_cast ругает. текст ошибки : static_cast: невозможно преобразовать "float *" в "unsigned char *" а почему такие ограничения ??? а почему ??? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
кстати в стиле классического Си cp = (TYPEPTR)(&d); получается нормально ! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 13:44 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
andron81, static_cast предназначен для приведения между типами для которых существует встроенное или пользовательское преобразование (из float в int, например). Между типами float* и char* таких преобразований нет. У reinterpret_cast другое предназначение - (там список длинный вообще-то, но в частности) приведение между типами совместимыми в соответствии с правилами алиасинга. Как в вашем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 14:21 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky andron81, static_cast предназначен для приведения между типами для которых существует встроенное или пользовательское преобразование (из float в int, например). Между типами float* и char* таких преобразований нет. примечательно , что float * -> void * тоже пользовательским преобразованием считается :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 14:53 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky andron81, static_cast предназначен для приведения между типами для которых существует встроенное или пользовательское преобразование (из float в int, например). Между типами float* и char* таких преобразований нет. В этой концепции непонятно почему указатель на базовый класс можно преобразовать к указателю на класс наследника с помощью static_cast? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 16:00 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravпочему указатель на базовый класс можно преобразовать к указателю на класс наследника с помощью static_cast? Потому что метод такого преобразования известен во время компиляции. Отсюда его название "static". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 16:13 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravпочему указатель на базовый класс можно преобразовать к указателю на класс наследника с помощью static_cast? Потому что метод такого преобразования известен во время компиляции. Отсюда его название "static". И каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 16:52 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
andron81 примечательно , что float * -> void * тоже пользовательским преобразованием считается :) Не пользовательским а встроенным )) Это специальный указатель к/из которому можно приводить любой. Фича досталась от С. Это можно считать вырожденным случаем приведения к указателю на базовый класс, про который выше писали. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 17:15 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petrav И каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? У компилятора есть вся инфа, чтобы сгенерить нужный код, который будет один и тот же для любых экземпляров этих классов. static, другими словам )). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 17:22 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky petrav И каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? У компилятора есть вся инфа, чтобы сгенерить нужный код, который будет один и тот же для любых экземпляров этих классов. static, другими словам )). Ну посмотрим: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Это собирается и я не вижу оснований для такого лихого преобразования от базового класса к наследнику. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 17:29 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petrav Это собирается и я не вижу оснований для такого лихого преобразования от базового класса к наследнику. Ну все правильно. Никто не обещал диагностировать UB. Ведь приводить можно или вниз или вверх по иерархии, а не в бок )) В foo компилятор не знает о классе S3 (и не имеет такой возможности). Он работает с теми типами о которых вы ему сообщили. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 17:35 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky petrav Это собирается и я не вижу оснований для такого лихого преобразования от базового класса к наследнику. Ну все правильно. Никто не обещал диагностировать UB. Ведь приводить можно или вниз или вверх по иерархии, а не в бок )) В foo компилятор не знает о классе S3 (и не имеет такой возможности). Он работает с теми типами о которых вы ему сообщили. Чисто формально я понимаю почему так отработал static_cast. Но очевидно, что он не должен производить преобразования к наследникам. И поведение static_cast ну... противоречит вашим словам о встроенных и пользовательских преобразованиях. Т.е. я так же как вы и сказали понимаю static_cast. Но тут как обычно косяк. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 17:44 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravИ каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? Внезапно: вычитанием из него константы. Сравни результат преобразования к наследнику с помощью dynamic_cast, static_cast и reinterpret_cast. "Сурпрайз будет..." (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:08 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravИ каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? Внезапно: вычитанием из него константы. Сравни результат преобразования к наследнику с помощью dynamic_cast, static_cast и reinterpret_cast. "Сурпрайз будет..." (с) Внезапно, но в точке преобразования указателя предка к наследнику у тебя нет информации об этой константе. Сурпрайз, не? PS: Конечно, речь идёт о static и static_cast. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:21 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravСурпрайз, не? Реально сурпрайз. Я всегда был уверен, что класс наследника должен быть объявлен перед преобразованием к нему. Покажешь компилируемый код, где это не так? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:23 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravСурпрайз, не? Реально сурпрайз. Я всегда был уверен, что класс наследника должен быть объявлен перед преобразованием к нему. Покажешь компилируемый код, где это не так? Ну вообще не верно ни в каких смыслах. Про static_cast код выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:25 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
andron81 примечательно , что float * -> void * тоже пользовательским преобразованием считается :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:29 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petrav И каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:31 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
rdb_dev petrav И каким же образом ты указатель на базовый класс собрался преобразовывать в указатель на класс наследника во время компиляции? Не придирайтесь к словам. Мы не в юридической конторе работаем. Я всё сказал максимально понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:35 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravПро static_cast код выше. И? Всё объявлено, смещение S2 относительно S1 равно sizeof(VMT*) или 0 по выбору компилятора. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:38 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravПро static_cast код выше. И? Всё объявлено, смещение S2 относительно S1 равно sizeof(VMT*) или 0 по выбору компилятора. И то, что в точке компиляции static_cast (в моём примере) у компилятора нет информации о правомерности преобразования S1* в S2*. Это не информация static (этап компиляции), это информация этапа runtime и static_cast не имеет права заниматься такими преобразованиями раз он не имеет о нём информации. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:44 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravЭто не информация static (этап компиляции), это информация этапа runtime и static_cast не имеет права заниматься такими преобразованиями раз он не имеет о нём информации. Runtime информация это всего лишь правомочность такого преобразования. Само преобразование сугубо одинаково. И именно в этом отличие static_cast от dynamic_cast: runtime проверка правомочности. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:48 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravЭто не информация static (этап компиляции), это информация этапа runtime и static_cast не имеет права заниматься такими преобразованиями раз он не имеет о нём информации. Runtime информация это всего лишь правомочность такого преобразования. Само преобразование сугубо одинаково. И именно в этом отличие static_cast от dynamic_cast: runtime проверка правомочности. Если преобразование называется static, то оно должно работать корректно на этапе компиляции. Должно! Если такое преобразование не имеет на этапе компиляции информации о данном преобразовании, то такое static преобразование и не должно компилироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:53 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
petravне должно компилироваться Раз компилируется - значит имеет. А за полной защитой от дурака, это к языкам четвёртого поколения. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 19:08 |
|
почему я тут не могу заменить reinterpret_cast на static_cast ?
|
|||
---|---|---|---|
#18+
andron81, > почему такие ограничения ??? Намеренно, ибо противоестественный акт такого каста требует самый грубый каст. Static_cast предназначен для сужения типа, а у вас разные типы. Однако, вы можете сделать каст через void*, как в вашей другой теме. Void* - самый широкий класс, его можно сузить до любого типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2020, 01:10 |
|
|
start [/forum/topic.php?fid=57&fpage=6&tid=2017326]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 150ms |
0 / 0 |