what does this syntax int(x)
in the statement Foo f( int(x) );
mean?
The parentheses around x
are superfluous and will be ignored. So int(x)
is the same as int x
here, which means a parameter named x
with type int
.
Is it the same as Foo f( int x );
?
Yes. Foo f( int(x) );
, is a function declaration which is named f
, returns Foo
, takes one parameter named x
with type int
.
Here's the explanation from the standard. [dcl.ambig.res]/1:
(emphasis mine)
The ambiguity arising from the similarity between a function-style
cast and a declaration mentioned in [stmt.ambig] can also occur in the
context of a declaration. In that context, the choice is between a
function declaration with a redundant set of parentheses around a
parameter name and an object declaration with a function-style cast as
the initializer. Just as for the ambiguities mentioned in
[stmt.ambig], the resolution is to consider any construct that could
possibly be a declaration.
Note: A declaration can be
explicitly disambiguated by adding parentheses around the argument.
The ambiguity can be avoided by use of copy-initialization or
list-initialization syntax, or by use of a non-function-style cast.
struct S {
S(int);
};
void foo(double a) {
S w(int(a)); // function declaration
S x(int()); // function declaration
S y((int(a))); // object declaration
S y((int)a); // object declaration
S z = int(a); // object declaration
}
So, int(x)
will be considered as a declaration (of the parameter) rather than a function style cast.