There is no difference between type(x)
and (type)x
. These two are completely equivalent. Most people prefer type(x)
for classes and (type)x
for non-class types, but that's purely up to one's own choice. Both call constructors for classes with one argument x
.
The preferred way for classes is type(x)
, because this allows passing more than one argument to the constructor, as in type(x, y)
. Trying to apply the other form, (type)x, y
will not work: It casts x
, and then applies the comma operator and evalutes y
in isolation. Parentheses like (type)(x, y)
do not help: This will evaluate x
and y
in isolation using the comma operator and then cast y
to type
.
For non-class types, such a cast is often too powerful. C++ has static_cast<type>(x)
for roughly doing the reverse of an implicit conversion (such as casting base classes to derived classes and casting void*
to another pointer), which often is what fits in. See When should static_cast, dynamic_cast and reinterpret_cast be used?.
stringstream
is not a function, though. Doing function(x)
will call it the function, but doing (function)x
is illegal, beause there are two expressions next to each other, with no operator in between.
For those who don't believe this answer, and downvote it on gut feeling, please consult the Standard at 5.2.3/1
A simple-type-specifier (7.1.5) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…