Ошибки, баги, вопросы - страница 2521

 

fxsaber:
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

Первое присваивание работает только в MQL. И очень плохо, что оно работает.  Хотелось бы, чтоб отменили, наконец, это недоразумение.  Со вторым - проблем нет.

 
Alexey Navoykov:

Первое присваивание работает только в MQL. И очень плохо, что оно работает.  Хотелось бы, чтоб отменили, наконец, это недоразумение.  Со вторым - проблем нет.

Странно. Я считал, что первое работать обязано, а второе - нет.

 
fxsaber:

Странно. Я считал, что первое работать обязано, а второе - нет.

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

Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа.  Это значит, что правый объект сначала неявно кастится к типу левого объекта,  а потом уже происходит присваивание (копирование).  И в первом случае естественно такой кастинг (A->B) невозможен.  В C++ будет ошибка.  А в MQL вместо этого левый объект кастится к правому и выполняется A::operator=(A&), замещая лишь часть объекта b.  Разве это присваивание?

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

 
Alexey Navoykov:

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

Так это удобно, вроде. В контексте структур, конечно.

 
fxsaber:

Так это удобно, вроде. В контексте структур, конечно.

Да сомнительное удобство.  Может оно и экономит символы в строке, но является источником случайных ошибок и затрудняет/искажает понимание кода. Как уже сказано выше, знак равенства имеет чёткий и однозначный смысл, что объект меняется целиком.  Поэтому в данном случае оператор используется не по назначению.  Если хочется такого нестандартного поведения, то следует перегрузить оператор для таких целей.

p.s. Допускаю лишь исключение, если класс B не имеет собственных полей, т.е. полностью совпадает с классом A (полностью эквивалентен ему), тогда нет причин препятствовать такому присвоению.  Хотя в C++ оно всё-равно не работает, но в MQL можно разрешить.

 
Slava:

В opt-файле в куске, где прописаны все входные параметры, значение для оптимизируемых параметров (определяется через поля size и offset) содержит не Value (как без оптимизации), а Start.

Логично, если там будет Value.

 
Alexey Navoykov:

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

Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа. 

Суть операций для пользовательских типов заранее не определена. А определен лишь их порядок, который в данном случае заключается в вызове подходящего operator= 

В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову А::operator=(const A&);

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

 
A100:

В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову b.operator=(const A&);

Ну да, в этом и проблема. Но разница в написании тут роли не играет.  В С++ не скомпилируется в обоих случаях.

В общем случае здесь нет противоречий. В частном случае присваивания эквивалентного объекта есть некая нестыковка сущностей

Противоречие будет хотя бы с С++.  Если такое компилируется, значит правый операнд неявно кастится к левому, и затем происходит полное замещение объекта.  Как оно и должно работать по логике.  Пример с int->long я приводил.  А замещение части внутренностей объекта не есть присваивание.  Поэтому тут всё в одном: и противоречие, и нестыковка.

p.s. Хотя ещё может быть перегружен оператор B::operator=(A&) , но я полагаю, здравомыслящий программист там тоже полностью заменит объект B, а не частично.  Ибо в этом суть присваивания.

Если кому хочется лаконичного написания,  то можно было бы сделать для этого какой-то другой оператор:  &= или |=  например .  Они по крайней мере не являются общеупотребительными, поэтому не перепутаешь.

 
Alexey Navoykov:

..........

Противоречие будет хотя бы с С++. ......

..........

С чего Вы взяли, что MQL должна полностью соответствовать С++ ???

С-подобный - вовсе не означает эквивалентный!

MQL разработан для вполне определённых задач и вовсе не обязан полностью копировать язык, на основе которого был создан. 

Может уже хватит возмущаться?

А вот в Паскале можно .........

А в Ассемблере так .....

А на ява ....

А на Бэйсик ....

Вы что, в сравнение языков тут практикуетесь?

=======

П.С. Это я не только Вам...

 
Сергей Таболин:

С чего Вы взяли, что MQL должна полностью соответствовать С++ ???

...

Вы что, в сравнение языков тут практикуетесь?

Я отвечал на конкретную фразу. Успокойтесь. Выпейте валерьянки и ложитесь спать, вам вредно волноваться.    ...Эк же у некоторых тут подгорает при слове "C++" )

Причина обращения: