Поделиться через


Разрешение неоднозначностей

Для выполнения явных преобразований из одного типа в другой необходимо использовать приведения, указывая имя требуемого типа. Некоторые приведения типов ведут к синтаксической неоднозначности. Следующее приведение типов в стиле функции неоднозначно.

char *aName( String( s ) );

Неясно, является ли этот оператор объявлением функции или объявлением объекта с приведением типов в стиле функции в качестве инициализатора: такой оператор может объявлять функцию, возвращающую тип char *, который принимает один аргумент типа String, или объявлять объект aName и инициализировать его со значением приведения s в тип String.

Если объявление может считаться допустимым объявлением функции, оно считается таковым. Оператор проверяется на предмет того, представляет ли он приведение типов в стиле функции, только в том случае, если объявление не может считаться объявлением функции, т. е. оно синтаксически неверно. Поэтому компилятор считает данный оператор объявлением функции и игнорирует скобки вокруг идентификатора s. С другой стороны, операторы

char *aName( (String)s );

и

char *aName = String( s );

однозначно являются объявлениями объектов и для инициализации объекта aName вызывается пользовательское преобразование типа String в тип char *.

См. также

Ссылки

Абстрактные деклараторы в C++