Max
Возможно. Я уже отучился так писать и других по руках бью на рев"ю.
Max
Я вот в принципе не понимаю, зачем bool к float переводить. Уже лучше так float x = bool_val ? 1.0 : 0.0;
kitsu
а вот при (float)bool_val я хз
скорее всего reinterpret_cast вызовется, так что очень может быть
Max
скорее всего reinterpret_cast вызовется, так что очень может быть
Поэтому всегда делай static_cast. reinterpret_cast имеет смысл только когда больше ничто не вывозит
Max
... и даже тогда он не имеет смысла :)
Anonymous
float(bool_val), дайте мне стикер с всратым винни пухом.
Aidar
Интересно как должен выглядеть реинтерпреткаст это штуки
Max
нет, не вызовется
Кхм-кхм. 1) When the C-style cast expression is encountered, the compiler attempts to interpret it as the following cast expressions, in this order: a) const_cast<new_type>(expression); b) static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambiguous non-virtual base; c) static_cast (with extensions) followed by const_cast; d) reinterpret_cast<new_type>(expression); e) reinterpret_cast followed by const_cast. The first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled (see example). If the cast can be interpreted in more than one way as static_cast followed by a const_cast, it cannot be compiled. In addition, C-style cast notation is allowed to cast from, to, and between pointers to incomplete class type. If both expression and new_type are pointers to incomplete class types, it's unspecified whether static_cast or reinterpret_cast gets selected.
Max
скорее всего reinterpret_cast вызовется, так что очень может быть
Читай выше. Стандарт описывает последовательность действий.
Aidar
Ну это статиккаст
Max
Так что шанс на то, что будет вызван именно reinterpret_cast существует.
kitsu
ну последовательность то явна задана, так что определенно статик
Max
Ну это статиккаст
Это порядок действий, когда ты кастуешь С-шным способом неявно, вот как float(bool) например
Matwey
https://godbolt.org/g/JkyUWc
Matwey
static_cast короче получается
kitsu
Никто гарантий не дает
".. in this order"
Max
".. in this order"
Я имею ввиду, что static_cast может сфейлиться, и тогда компилятор пойдет дальше
Aidar
Max
В этом главная причина писать явно, который каст ты хочешь. В этом может и нет, но в конечном итоге все зависит от компилятора.
Matwey
Так что предлагаю продолжать писать static_cast<float>(bool_val)
Matwey
меньше инструкций и литерал хранить не нужно
Matwey
и условных переходов нет!
Aidar
Статик каст же статичен
Matwey
а если серьезно, почему оптимизатор не сообразил что происходит в тернарном операторе?
Matwey
А динамик - динамичен
Matwey
Да\
Matwey
А в чем вопрос?
Matwey
Я вон ссылку кинул на годболт
Matwey
Почему не сообразил? Что ти хотел там увидеть?
cvtsi2ss хотел увидеть, а его там нету
Berkus
Я имею ввиду, что static_cast может сфейлиться, и тогда компилятор пойдет дальше
first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled
Matwey
А вместо этого есть поход за литералом, который в памяти находится хрен знает где
Constantine
вот так догадается clang
Matwey
float square2(bool num) { return num ? 1 : 0; }
тогда уж просто return num
Matwey
а то у тебя тут неявный каст из инта во флоат
Constantine
а то у тебя тут неявный каст из инта во флоат
ну неявный каст константы это такая себе проблема
Max
first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled
Ну да, но никогда не знаешь на 100%, будет ли static_cast удовлетворять компилятор, чтоб он попытался его вызвать. И вообще, мораль в том, чтоб не писать сишное приведение :)
Constantine
https://godbolt.org/g/XeCNJb вот это забавно
Constantine
надо еще довешивать разрешения floating point оптимизаций, видимо
Constantine
я что-то не знаю?
Constantine
// Note: “for (auto& x : f().items())” is WRONG почему?
Constantine
> std::vector<int>& items()
Constantine
ладно ок
Aidar
лол
Constantine
> std::vector<int>& items()
вот поэтому у нас в коде такая функция должна быть названа itemsCref()
Aidar
размер не важен
Aidar
о да
Aidar
ато щас анально привязано к ситайму
🙃
>Boost на работе запрещён
Aidar
ну а 16битный флоат тоже нужен давно
🙃
Тяжко же вам жить там
Aidar
лучше всетаки wide_float
Aidar
<>
🙃
Ну хотя если последние стандартны разрешены - может без буста и можно
🙃
У нас выше С++11 пока нельзя
🙃
причём разрешили только в прошлом году
🙃
И то, не везде С++11 можно применять, куча заказчиков которые хотят компилять некрокомпилятором под windows CE, и некоторые либы приходится держать на более старом стандарте
🙃
Ну это круто, у нас так нельзя :)
🙃
мы типа либы продаём, и приходится держать их в состоянии возможном для линковки некрокомпилятором
Max
>И так как код не легаси Есть вакансии? 😒
Matwey
Да
Интересно, можно ли сделать под капотом C++11, а интерфейс C++03?
Max
Львов
Matwey
а в Украине?
🙃
Интересно, можно ли сделать под капотом C++11, а интерфейс C++03?
Ну это надо заставить компилятор который умеет собирать С++11 код, генерить бинарники которые подхватит старый компайлер. Теоретически возможно, но на практике никто заморачиваться не будет, слишком геморно
🙃
А со стандартной библиотекой как?
Ну из стандартной всё можно юзать
🙃
и из буста всё
Matwey
ну ваша библиотека же потащит стандартную библиотеку в зависимостях
Matwey
?
🙃
Ну да
🙃
так мы компиляем кучей разных компиляторов для разных заказчиков
🙃
там чуть ли не отдельный компилятор для каждого заказчика
🙃
Ну да, хоть с этим у нас проблем нет