Язык программирования C++ для профессионалов



Неоднозначности - часть 2


class quad { // ... public: quad(double); // ... };

quad operator+(quad,quad);

void f(double a1, double a2) { quad r1 = a1+a2; // сложение с двойной точностью quad r2 = quad(a1)+a2; // вынуждает использовать // операции с типами quad }

В проектировании языка делался расчет на строго восходящий разбор, поскольку он более понятный, а кроме того, не дело транслятора решать такие вопросы, какую точность для сложения желает программист.

Однако, надо отметить, что если определились типы обеих частей в присваивании и инициализации, то для их разрешения используется они оба:

class real { // ... public: operator double(); operator int(); // ... };

void g(real a) { double d = a; // d = a.double(); int i = a; // i = a.int();

d = a; // d = a.double(); i = a; // i = a.int(); }

В этом примере выражения все равно разбираются строго восходящим методом, когда в каждый момент рассматриваются только одна операция и типы ее операндов.




Содержание  Назад  Вперед