This is a functional style type conversion that creates t from int by calling the constructor. It is not possible to explicitly call a constructor in C ++.
This is described in [expr.type.conv] (N3337):
5.2.3 Explicit type conversion (functional notation)
1) A simple type specifier (7.1.6.2) or typename-specification (14.6) followed by a parenthesized list of expressions creates a value of the specified type based on the list of expressions. If the list of expressions is one expression, the expression of the type conversion is equivalent (in certainty, and if defined in meaning) to the corresponding (5.4). If the specified type is a class type, the class type must be complete. If the list expression indicates more than one value, the type must be a class with the corresponding declared constructor (8.5, 12.1), and the expression T(x1, x2, ...) is actually equivalent to the declaration T t(x1, x2, ...); for some invented time variable t , resulting in the value of t as the value of pr.
Since t is a specifier of a simple type, this is equivalent to the corresponding expression. This is allowed to execute the equivalent of a static_cast ( [expr.cast]/4 ), which determines the final result of the conversion:
[expr.static.cast]/4: Otherwise, the expression e can be explicitly converted to type t using the static_cast form static_cast<T>(e) if the declaration is T t(e); is correct for some invented time variable t (8.5). the effect of such an explicit conversion is the same as performing a declaration and initialization, and then using a temporary variable as a result of the conversion. The expression e used as a glvalue if and only if initialization uses it as a glvalue.
source share