Знатоки стандарта, ау!
От: Lummox  
Дата: 10.03.02 16:17
Оценка:
В пятом Билдере такая борода:
if(some_bool_value)
   (Button1->Height+=30),(Button1->Width+=30);

вызывает следующий напряг:
[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду.
Вопроса два:
1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?
2) Разве в стандарте чё-нить есть по этому поводу?
В отличье от себя — тебе я верю...
Re: Знатоки стандарта, ау!
От: Brother Россия  
Дата: 10.03.02 18:49
Оценка:
Здравствуйте Lummox, Вы писали:
L>2) Разве в стандарте чё-нить есть по этому поводу?
На сколько я себе представляю, в стандарте вообще нет ничего о свойствах ("property"). Т.к. свойства — нестандартные расширения языка (я так понимаю, попавшие в Builder из Delphi в целях совместимости с библиотекой VCL.
С уважением,
Сергей
Re: Знатоки стандарта, ау!
От: Андрей Тарасевич Беларусь  
Дата: 10.03.02 22:07
Оценка: 15 (1)
Здравствуйте Lummox, Вы писали:

L>В пятом Билдере такая борода:

L>
L>if(some_bool_value)
L>   (Button1->Height+=30),(Button1->Width+=30);
L>

L>вызывает следующий напряг:
L>[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
L>В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду.
L>Вопроса два:
L>1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?

Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.

L>2) Разве в стандарте чё-нить есть по этому поводу?


В языке С++, как таковом, никаких проперти нет и в помине. Поэтому стандарт тут совершенно ни при чем. Это самодеятельность авторов компилятора. Как захотят — так и сделают.
Best regards,
Андрей Тарасевич
Re: Знатоки стандарта, ау!
От: Pavel Ivlev www.vsi.ru/~pavel
Дата: 11.03.02 08:11
Оценка:
Здравствуйте Lummox, Вы писали:

L>В пятом Билдере такая борода:

L>
L>if(some_bool_value)
L>   (Button1->Height+=30),(Button1->Width+=30);
L>

L>вызывает следующий напряг:
L>[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"

Какая версия у твоего компилятора? У меня 5.5.1 и он нормально обрабатывает такой код.
Re[2]: Знатоки стандарта, ау!
От: Lummox  
Дата: 12.03.02 04:31
Оценка:
Здравствуйте Pavel Ivlev, Вы писали:
=cut=
PI>Какая версия у твоего компилятора? У меня 5.5.1 и он нормально обрабатывает такой код.
5.0
В отличье от себя — тебе я верю...
Re[2]: Знатоки стандарта, ау!
От: Lummox  
Дата: 12.03.02 04:47
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:
L>>В пятом Билдере такая борода:
L>>
L>>if(some_bool_value)
L>>   (Button1->Height+=30),(Button1->Width+=30);
L>>

L>>вызывает следующий напряг:
L>>[C++ Error] : E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
L>>В то время, как Borland C++5, Borland Builder1.0 и MSVC6 не имеют ни каких претензий к подобному коду.
L>>Вопроса два:
L>>1) почему вдруг стало необходимо накладывать ограничения на присвоения к пропертям?

АТ>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.


1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.
2) Билдер сказал, что "присвоение к пропертям возможно только при помощи простых операторов", тогда как опреатор
(Button1->Height+=30),(Button1->Width+=30);

является сложным (в нем на самом деле два оператора, разделенных запятой). Если заменить это на
{
   Button1->Height+=30;
   Button1->Width+=30;
}

, то ни каких проблем не возникает (хотя тут есть +=), поскольку присвоение осуществляется простыми операторами. Вопрос в следующем: ЗАЧЕМ НАКЛАДЫВАТЬ ОГРАНИЧЕНИЯ на присвоение к пропертям? Т.е. в более ранних версиях Билдера не было этого ораничения и по этому опреатор
(Button1->Height+=30),(Button1->Width+=30);

не вызывал ни каких вопросов.
Итак, кто нить знает ЗАЧЕМ НАКЛАДЫВАТЬ ОГРАНИЧЕНИЯ на присвоение к пропертям?
В отличье от себя — тебе я верю...
Re[3]: Знатоки стандарта, ау!
От: IT Россия linq2db.com
Дата: 12.03.02 04:49
Оценка:
Здравствуйте Lummox, Вы писали:

L>Итак, кто нить знает ЗАЧЕМ НАКЛАДЫВАТЬ ОГРАНИЧЕНИЯ на присвоение к пропертям?


А кто сказал, что это ограничение? Может это просто глюк. Хотели ребята из Борланда сделать как лучше, а получилось как всегда.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Знатоки стандарта, ау!
От: Андрей Тарасевич Беларусь  
Дата: 12.03.02 06:38
Оценка:
Здравствуйте Lummox, Вы писали:

АТ>>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.

L>
L>1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.

Нет, нельзя.

Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.

Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...
Best regards,
Андрей Тарасевич
Re[4]: Знатоки стандарта, ау!
От: Pavel Ivlev www.vsi.ru/~pavel
Дата: 12.03.02 11:38
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...


В каком смысле "не эмулируется"? В простых случаях реализация одинаковая:
        
int a = 0;
a++; a+=1; a=a+1;

Здесь реализация операций ++, +=, a=a+1 совершенно одинаковая.
Re[4]: Знатоки стандарта, ау!
От: Lummox  
Дата: 12.03.02 16:13
Оценка:
Здравствуйте IT, Вы писали:

IT>А кто сказал, что это ограничение? Может это просто глюк. Хотели ребята из Борланда сделать как лучше, а получилось как всегда.


Но это именно ограничение, поскольку его нарушение влечет за собой вполне конкретную ошибку, а не unidetified behaviour или какую-нить Unknown Error (каковая как раз и возникает когда получается как всегда)
В отличье от себя — тебе я верю...
Re[4]: Знатоки стандарта, ау!
От: Lummox  
Дата: 12.03.02 16:17
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Здравствуйте Lummox, Вы писали:


АТ>>>Вполне логичное ограничение. Впрямую функциональность оператора '+=' через интерфейс проперти реализовать невозможно. А автоматически интерпретировать такую запись, как 'Button1->Height = Button1->Height + 30' — это совершенно не в стиле С++. Если тебе надо сделать 'Button1->Height = Button1->Height + 30' — так и пиши.

L>>
L>>1) Впрямую функциональность оператора '+=' через интерфейс проперти реализовать МОЖНО! У Билдера не с "+=" напряги возникли.

АТ>Нет, нельзя.


АТ>Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.


АТ>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...


Но почему?
Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением?
С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему?
ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?
В отличье от себя — тебе я верю...
Re[5]: Знатоки стандарта, ау!
От: Vi2 Удмуртия http://www.adem.ru
Дата: 13.03.02 05:02
Оценка:
Здравствуйте Lummox, Вы писали:

L>Здравствуйте Андрей Тарасевич, Вы писали:


L>Но почему?

L>Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением?
L>С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему?
L>ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?

Вот выдержка из МСДН:

Microsoft Specific —>

__declspec( property( get=get_func_name ) ) declarator
__declspec( property( put=put_func_name ) ) declarator
__declspec( property( get=get_func_name, put=put_func_name ) ) declarator

This attribute can be applied to non-static “virtual data members” in a class or structure definition. The compiler treats these “virtual data members” as data members by changing their references into function calls.

When the compiler sees a data member declared with this attribute on the right of a member-selection operator (“.” or “->“), it converts the operation to a get or put function, depending on whether such an expression is an l-value or an r-value. In more complicated contexts, such as “+=“, a rewrite is performed by doing both get and put.

This attribute can also be used in the declaration of an empty array in a class or structure definition. For example:

__declspec(property(get=GetX, put=PutX)) int x[];
The above statement indicates that x[] can be used with one or more array indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and p->x[a][b] = i will be turned into p->PutX(a, b, i);

END Microsoft Specific
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Знатоки стандарта, ау!
От: Андрей Тарасевич Беларусь  
Дата: 13.03.02 07:19
Оценка:
Здравствуйте Lummox, Вы писали:

АТ>>Во-первых, замена '+=' на сложение с последующим присваиванием — это не впрямую.


АТ>>Во-вторых, в С++ функциональность оператора '+=' никогда и нигде не эмулируется через сложение с присваиванием. '+=' — это совершенно самостоятельный оператор. За такие трюки писателям компилятора надо бить по рукам. Хотя, пропертям, как известно, закон не писан...

L>
L>Но почему?
L>Кто сказал, что упомянутая функциональность эмулируется через сложение с последующим присвоением?

А как еще? Операция '+=' не является просто сокращением для "чтения + увеличение + присваивание". Это совершенно самостоятельная операция, которая выполняет инкремент своего аргумента "на месте".

L>С твоих слов я понял, что, присваивая к пропертям, использовать "+=" нельзя и всё тут — нельзя и хуч ты тресни. А вот почему нельзя — не понял. Поясни пожалуйста почему?


L>ЗЫ Може я не правильно понимаю слово проперти(property)? Под пропертёй я понимаю любую публичную(public) переменную класса, это верно?


Вообще говоря, под проперти обычно понимается "мнимое" поле класса. Если у некоторого класса есть проперти 'a', то внешне работа с 'a' выглядит как работа с обычным полем класса. Но физически в классе такого поля нет, а все обращения к 'a' компилятор автоматически заменяет на вызов одной из двух функций — одна для чтения 'a' и одна для записи 'a'. Как я понимаю, именно о таких проперти шла речь здесь.

Единственная модифицирующая операция, которая определена для проперти — это присваивание. Оно превращается в вызов функции записи проперти. Никакие другие модифицирующие операции к проперти, по идее, применимы быть не должны. Только присваивание. Создателям компиляторов показалось, что неплохой идеей быдет выражение других модифицирующих операций (например '+=') через немодифицирующие операции (например, '+') и присваивание. Это плохая идея. В С++, если у некоторого объекта не операции '+=', то ее нельзя применить к этому объекту. Нигде и никогда в С++ операция '+=' не эмилируется компилятором через '+' и '='. С чего это вдруг для проперти должно делаться исключение?
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.