R Справочное руководство по С++

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;        // оператор-выражение
           }

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.