Подтвердить что ты не робот

В С++, каковы различия между 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;

Вы когда-нибудь видели последнего? Мне кажется, я видел это в каком-то фрагменте, написанном Страуступом, но я не могу найти ссылку.

4b9b3361

Ответ 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