В С++, каковы различия между static_cast <double> (a) и double (a)?
В чем разница между
int a;
// a gets some value
double pi = static_cast<double>(a)/3;
и
int a;
// a gets some value
double pi = double(a)/3;
Вы когда-нибудь видели последнего? Мне кажется, я видел это в каком-то фрагменте, написанном Страуступом, но я не могу найти ссылку.
Ответы
Ответ 1
Кто-то, возможно, думал, что они строят, а не кастинг. Рассмотрим:
some_fun(std::string("Hello"));
Многие думают, что они называют конструктора там, когда на самом деле они делают C-стиль. Так получилось, что кастинг будет смотреть на конструкторы целевого типа среди длинного списка других вещей, на которые он смотрит, и поэтому здесь он в конечном итоге вызывает вызов конструктора.
Признаки функциональных нотации имеют все те же недостатки, что и другие типы C:
- Может непреднамеренно отбросить константу.
- Могут бесшумно превращаться в реинтерпрет.
- Трудно отличить инструменты grepping.
Помимо всего этого, вы выполняете точно такую же операцию в обоих случаях.
Ответ 2
Последнее упоминается как функциональная нотация явного литья, где вы явно указываете a
, следует рассматривать как double
. Вы можете в значительной степени использовать что-либо для любого типа, используя эту технику.
Первый является предпочтительным способом создания типа на С++. Он выполняет базовую проверку, чтобы убедиться, что тип, который вы производите, имеет смысл (указатель дочернего класса на указатель базового класса и т.д.). Кроме того, как и в примере, который вы показываете, вы можете выполнять неявные преобразования. Технически static_cast
в вашем примере является явным, но результат операции (назначение) неявный.
Ответ 3
Нет разницы в сгенерированном коде сборки между static_cast<double> (a)
и (double) a
. Ключевое преимущество нотной маркировки (type_id) cast_expression
заключается в том, что она более гибкая. В одной ситуации это может быть эквивалентно a const_cast
, в другом, a static_cast
, в еще одном, a dynamic_cast
, в еще одном, комбинация const_cast
и static_cast
(или dynamic_cast
).
Эта сила также является слабостью. Нотные обозначения означают разные вещи в разных местах. Другим недостатком является то, что очень легко найти xxx_cast<type_id> (cast_expression)
. Просто найдите _cast
. Очень сложно найти выражения, использующие нотные обозначения.
Ответ 4
Использование static_cast - безопасный стиль в стиле С++, но (двойной) - небезопасный старый стиль C-стиля.
см. здесь: Тип Casting