Resolving ambiguous declarations (C++)


The latest version of this topic can be found at Resolving ambiguous declarations (C++).

To perform explicit conversions from one type to another, you must use casts, specifying the desired type name. Some type casts result in syntactic ambiguity. The following function-style type cast is ambiguous:

char *aName( String( s ) );  

It is unclear whether it is a function declaration or an object declaration with a function-style cast as the initializer: It could declare a function returning type char * that takes one argument of type String, or it could declare the object aName and initialize it with the value of s cast to type String.

If a declaration can be considered a valid function declaration, it is treated as such. Only if it cannot possibly be a function declaration — that is, if it would be syntactically incorrect — is a statement examined to see if it is a function-style type cast. Therefore, the compiler considers the statement to be a declaration of a function and ignores the parentheses around the identifier s. On the other hand, the statements:

char *aName( (String)s );  


char *aName = String( s );  

are clearly declarations of objects, and a user-defined conversion from type String to type char * is invoked to perform the initialization of aName.

C++ Abstract Declarators