Разрешение неоднозначностей
Для выполнения явных преобразований из одного типа в другой необходимо использовать приведения, указывая имя требуемого типа. Некоторые приведения типов ведут к синтаксической неоднозначности. Следующее приведение типов в стиле функции неоднозначно.
char *aName( String( s ) );
Неясно, является ли этот оператор объявлением функции или объявлением объекта с приведением типов в стиле функции в качестве инициализатора: такой оператор может объявлять функцию, возвращающую тип char *, который принимает один аргумент типа String, или объявлять объект aName и инициализировать его со значением приведения s в тип String.
Если объявление может считаться допустимым объявлением функции, оно считается таковым. Оператор проверяется на предмет того, представляет ли он приведение типов в стиле функции, только в том случае, если объявление не может считаться объявлением функции, т. е. оно синтаксически неверно. Поэтому компилятор считает данный оператор объявлением функции и игнорирует скобки вокруг идентификатора s. С другой стороны, операторы
char *aName( (String)s );
и
char *aName = String( s );
однозначно являются объявлениями объектов и для инициализации объекта aName вызывается пользовательское преобразование типа String в тип char *.