Нет разницы; согласно стандарту (§5.2.3):
Спецификатор простого типа (7.1.5), за которым следует список выражений в скобках, создает значение указанного типа по заданному списку выражений. Если список выражений является одним выражением, выражение преобразования типа эквивалентно (в определенности и если определено в значении) соответствующему приведенному выражению (5.4).
Поскольку в вопросе указана разница между type(value)
и (type)value
, разницы нет абсолютно.
Если и только если вы имеете дело с списком значений, разделенных запятыми, разница может быть. В этом случае:
Если в списке выражений указано более одного значения, тип должен быть классом с соответствующим образом объявленным конструктором (8.5, 12.1), а выражение T (x1, x2, ...) фактически эквивалентно объявлению T t (х1, х2, ...); для некоторой изобретенной временной переменной t, результатом которой является значение t в качестве значения r.
Как указал Трубадур, есть определенные имена типов, для которых версия type(value)
просто не будет компилироваться. Например:
char *a = (char *)string;
скомпилирует, но:
char *a = char *(string);
не будет. Один и тот же тип с другим именем (например, созданный с typedef
) может работать, хотя:
typedef char *char_ptr;
char *a = char_ptr(string);