|
|
Существует неоднозначность в грамматике языка, касающаяся
оператора-выражения и описания, а именно, оператор-выражение,
содержащий как самое левое подвыражение явное преобразование типа,
заданное в функциональном стиле ($$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; // оператор-выражение }
| |