2014-10-17 2 views
3

Любая разница между (T)value и T(value)? Например, (float)3.14 и float(3.14). Что быстрее или лучше?Любая разница между (T) значением и T (значением)?

+5

Значение '(T)' вводит 'значение' в T с использованием каста C-стиля, которая выполняет 4 разных приведения, а' T (value) 'пытается вызвать конструктор' T' с аргументом 'value' в качестве аргумента (Это может быть известным синтаксисом для вас, если вы когда-либо пробовали создавать конструкторы классов) – Creris

+0

Итак, как правило, приведение должно выполняться быстрее, потому что оно выполняется в компиляции, правильно? float (a) caller, если a не известен в компиляции, поэтому он будет медленнее. – user1899020

+0

для таких типов, как float, это не имеет значения. Я полагаю (я никогда не пытался посмотреть сборку, сравнивая два случая). – Creris

ответ

7

Они имеют точно такой же эффект и смысл:

ISO/IEC 14882: 2011 5.2.3 Явное преобразование типа (функциональное обозначение):

Простой типа-спецификатор (7.1.6.2) или typename-specifier (14.6), за которым следует заключенный в скобки список выражений, строит значение указанного типа с учетом списка выражений. Если список выражений является одним выражением, выражение преобразования типа эквивалентно (в определении и, если определено в значении) , к соответствующему выражению выражения (5.4).

5,4 является «Явное преобразование типа (литой обозначения)», то есть (Т) литой выражение.

+0

Стоит отметить, что для некоторых типов (например, 'char *') используется только обозначение '(T) foo' законны. –

+0

@ T.C .: для некоторых * обозначений * not type, поскольку мы все еще можем использовать 'typedef', а затем использовать' char_pointer (value) '. – Jarod42

+0

@ Jarod42 Правда, я должен был быть более точным. Для типа, который не обозначается ни спецификатором простого типа *, ни * typename-specifier *, если быть точным. –

Смежные вопросы