В чем дело?
От: Аноним  
Дата: 30.05.04 15:33
Оценка:
Вызывается operator int().
Почему?
Компилятор VS7.1.

class Test
{
public:
    operator int()
    {
        return 1;
    }
};

int main()
{
    Test test;
    test["test"];
}
Re: В чем дело?
От: achp  
Дата: 30.05.04 15:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вызывается operator int().

А>Почему?

А>
А>class Test
А>{
А>public:
А>    operator int()
А>    {
А>        return 1;
А>    }
А>};

А>int main()
А>{
А>    Test test;
А>    test["test"];
А>}
А>


Компилятор пытается применить к объекту класса Test оператор []. Но "своего" такого оператора у этого класса нету. Значит нужно попробовать привести объект класса к какому-либо другому типу так, чтобы можно стало применить оператор [].

Так как у класса определен оператор приведения к типу int, рассматривается конструкция

(test.operator int())["test"];


Она является вполне легальной. Неоднозначности тоже нет — вот и применяется такая конструкция.
Re[2]: В чем дело?
От: rus blood Россия  
Дата: 30.05.04 16:08
Оценка:
A>Компилятор пытается применить к объекту класса Test оператор []. Но "своего" такого оператора у этого класса нету. Значит нужно попробовать привести объект класса к какому-либо другому типу так, чтобы можно стало применить оператор [].

A>Так как у класса определен оператор приведения к типу int, рассматривается конструкция


A>
A>(test.operator int())["test"];
A>


A>Она является вполне легальной. Неоднозначности тоже нет — вот и применяется такая конструкция.


... В итоге выражение транслируется в "test"[1], что дает 'е'.
Имею скафандр — готов путешествовать!
Re[3]: В чем дело?
От: Аноним  
Дата: 31.05.04 01:49
Оценка:
Здравствуйте, rus blood, Вы писали:


A>>Компилятор пытается применить к объекту класса Test оператор []. Но "своего" такого оператора у этого класса нету. Значит нужно попробовать привести объект класса к какому-либо другому типу так, чтобы можно стало применить оператор [].


A>>Так как у класса определен оператор приведения к типу int, рассматривается конструкция


A>>
A>>(test.operator int())["test"];
A>>


A>>Она является вполне легальной. Неоднозначности тоже нет — вот и применяется такая конструкция.


RB>... В итоге выражение транслируется в "test"[1], что дает 'е'.


Получается, что выражения 1 и 2 равнозначны, и res1 и res2 равны?
Объясните, почему?

char i = 1;
char res1 = i["test"]; // 1
char res2 = "test"[i]; // 2
Re[4]: В чем дело?
От: Павел Кузнецов  
Дата: 31.05.04 03:38
Оценка: 9 (2)
> Получается, что выражения 1 и 2 равнозначны, и res1 и res2 равны?
> Объясните, почему?
>
>
> char i = 1;
> char res1 = i["test"]; // 1
> char res2 = "test"[i]; // 2
>


Потому что для встроенных типов стандарт определяет выражения E1[E2] эквивалентными выражениям *((E1)+(E2)) — соответственно, порядок значения не имеет (5.2.1).
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: В чем дело?
От: GregZ СССР  
Дата: 31.05.04 05:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> Получается, что выражения 1 и 2 равнозначны, и res1 и res2 равны?

>> Объясните, почему?
>>
>>
>> char i = 1;
>> char res1 = i["test"]; // 1
>> char res2 = "test"[i]; // 2
>>


ПК>Потому что для встроенных типов стандарт определяет выражения E1[E2] эквивалентными выражениям *((E1)+(E2)) — соответственно, порядок значения не имеет (5.2.1).


Т.е.Вы хотите сказать, что хотя идексирование и выглядит как асимметричная операция, для встроеных типов она также будет коммутативной операцией?
Re[6]: В чем дело?
От: Павел Кузнецов  
Дата: 31.05.04 06:25
Оценка:
> ПК> для встроенных типов стандарт определяет выражения E1[E2] эквивалентными выражениям *((E1)+(E2)) — соответственно, порядок значения не имеет (5.2.1).

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


Да, по определению.
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.