Вызывается operator int().
Почему?
Компилятор VS7.1.
class Test
{
public:
operator int()
{
return 1;
}
};
int main()
{
Test test;
test["test"];
}
Здравствуйте, Аноним, Вы писали:
А>Вызывается operator int().
А>Почему?
А>А>class Test
А>{
А>public:
А> operator int()
А> {
А> return 1;
А> }
А>};
А>int main()
А>{
А> Test test;
А> test["test"];
А>}
А>
Компилятор пытается применить к объекту класса Test оператор []. Но "своего" такого оператора у этого класса нету. Значит нужно попробовать привести объект класса к какому-либо другому типу так, чтобы можно стало применить оператор [].
Так как у класса определен оператор приведения к типу int, рассматривается конструкция
(test.operator int())["test"];
Она является вполне легальной. Неоднозначности тоже нет — вот и применяется такая конструкция.
A>Компилятор пытается применить к объекту класса Test оператор []. Но "своего" такого оператора у этого класса нету. Значит нужно попробовать привести объект класса к какому-либо другому типу так, чтобы можно стало применить оператор [].
A>Так как у класса определен оператор приведения к типу int, рассматривается конструкция
A>A>(test.operator int())["test"];
A>
A>Она является вполне легальной. Неоднозначности тоже нет — вот и применяется такая конструкция.
... В итоге выражение транслируется в "test"[1], что дает 'е'.
Здравствуйте, 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
> Получается, что выражения 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
>> Получается, что выражения 1 и 2 равнозначны, и res1 и res2 равны?
>> Объясните, почему?
>>
>> >> char i = 1;
>> char res1 = i["test"]; // 1
>> char res2 = "test"[i]; // 2
>>
ПК>Потому что для встроенных типов стандарт определяет выражения E1[E2] эквивалентными выражениям *((E1)+(E2)) — соответственно, порядок значения не имеет (5.2.1).
Т.е.Вы хотите сказать, что хотя идексирование и выглядит как асимметричная операция, для встроеных типов она также будет коммутативной операцией?
> ПК> для встроенных типов стандарт определяет выражения E1[E2] эквивалентными выражениям *((E1)+(E2)) — соответственно, порядок значения не имеет (5.2.1).
> Т.е.Вы хотите сказать, что хотя идексирование и выглядит как асимметричная операция, для встроеных типов она также будет коммутативной операцией?
Да, по определению.
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен