Вопрос по c++ – В C ++, в чем различия между static_cast (a) и double (a)?

20

Каковы различия между

int a;
// a gets some value
double pi = static_cast<double>(a)/3;

а также

int a;
// a gets some value
double pi = double(a)/3;

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

когдаa являетсяint, static_cast<double>(a), (double)a, а такжеdouble(a) все семантически идентичны. Различия становятся очевидными, когдаa какой-то другой нескалярный тип, илиconst или жеvolatile, так далее. ildjarn
@ildjarn: на самом деле, не будетdouble(a) быть немного (но незначительным) медленнее при компиляции, потому что он сначала попытается сопоставитьconst_cast? KillianDS
Поиск static_cast & lt; double & gt; в вашем коде это намного проще. Это выделяется больше. user1356386
@ildjarn а с точки зрения производительности? Alessandro Jacopson
Идентичные средства идентичны - разницы нет вообще. ildjarn

Ваш Ответ

4   ответа
2

но (двойной) - небезопасный старый способ в стиле C.

посмотреть здесь:Тип литья

4

ждуstatic_cast<double> (a) а также(double) a, Основное преимущество литой нотации,(type_id) cast_expressionявляется то, что он более гибкий. В одной ситуации это может быть эквивалентомconst_castв другомstatic_castв еще одномdynamic_castв еще одной комбинацииconst_cast а такжеstatic_cast (или жеdynamic_cast).

Эта сила также слабость. Литая нотация означает разные вещи в разных местах. Еще одним недостатком является то, что это очень легко найтиxxx_cast<type_id> (cast_expression), Просто искать_cast, Очень трудно найти выражения, использующие нотацию приведения.

8

functional notation изexplicit casting где вы прямо говоритеa следует рассматривать какdouble, Вы можете в значительной степени привести к любому типу, используя эту технику.

Первый является предпочтительным способом приведения типа в C ++. Он выполняет базовую проверку, чтобы увидеть, что тип, к которому вы приводите, имеет смысл (указатель дочернего класса на указатель базового класса и т. Д.). Кроме того, как в примере, который вы показываете, вы можете выполнять неявные преобразования. Техническиstatic_cast в вашем примере это явный, но результат операции (присваивания) неявный.

14

some_fun(std::string("Hello"));

Многие люди думают, что они вызывают конструктор там, когда на самом деле они выполняют приведение в стиле C. Так уж сложилось, что приведение будет смотреть на конструкторы целевого типа среди длинного списка других вещей, на которые оно смотрит, и поэтому здесь, в конце концов, он вызывает конструктор.

Функциональные нотации имеют все те же слабости, что и другие типы C-бросков:

Can inadvertently cast away constness Can silently turn into a reinterpret cast Are hard to differentiate with grepping tools.

Помимо всего этого, тем не менее, вы выполняете абсолютно одинаковую операцию в обоих случаях.

Похожие вопросы