logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.6.8 Разрешение неоднозначности

Существует неоднозначность в грамматике языка, касающаяся

оператора-выражения и описания, а именно, оператор-выражение,

содержащий как самое левое подвыражение явное преобразование типа,

заданное в функциональном стиле ($$R.5.2.3), может быть не отличим от

описания, в котором первый описатель начинается со (. В таких случаях

оператор считается описанием.

Для разрешения неоднозначности следует исследовать весь оператор,

чтобы определить является он оператором-выражением или описанием.

Так устраняется неоднозначность во многих случаях. Например, пусть

T - имя-простого-типа ($$R.7.1.6), тогда имеем

T(a)->m = 7; // оператор-выражение

T(a)++; // оператор-выражение

T(a,5)<<c; // оператор-выражение

T(*e)(int); // описание

T(f)[]; // описание

T(g) = {1, 2 }; // описание

T(*d)(double(3)); // описание

Остальные случаи представляют описания. Например,

T(a); // описание

T(*b)(); // описание

T(c)=7; // описание

T(d),e,f=3; // описание

T(g)(h,2); // описание

Неоднозначность здесь чисто синтаксическая, т.е. на ее

разрешение не влияет тот факт, является ли имя именем-типа или нет.

Есть другой вид коллизии между оператором-выражением и описанием,

который разрешается требованием, чтобы описание функции в блоке

($$R.6.3) сопровождалось именем-типа, например:

void g()

{

int f(); // описание

int a; // описание

f(); // оператор-выражение

a; // оператор-выражение

}