Alexey Navoykov: Предлагаю не спорить, а просто поверить мне, что это ошибка.
Этот глагол слабо применим на техническом форуме. Попробовал C++
class A { };
class B : public A { };
A* a = new B;
B* b= dynamic_cast<B*>(a); // cannot dynamic_cast ‘a’ (of type ‘class A*’) to type ‘class B*’ (source type is not polymorphic)
B* b1= a; // invalid conversion from ‘A*’ to ‘B*’ [-fpermissive]
Ни один из вариантов не прокатил. Причины не ясны.
Если сделать их взаимозаменяемыми, тогда они оба просто не нужны.
В C++ возможно такое:
Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)
Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)
В таком виде он не нужен ни завтра ни через 10 лет. И внешняя схожесть не нужна, нужны возможности.
Чтоб хотя бы частично перенести STL из C++. А там дело не упирается только в operator->, там ещё много чего нужно.
operator-> был бы первым шагом на пути к умным указателям.
На самом деле с неявным кастом в том виде в котором он сейчас все не очень хорошо.
class A
{};
class B : public A
{};
voidOnStart()
{
A* ab = new B;
A* aa = new A;
B* bb = ab; // ok
B* ba1 = dynamic_cast<B*>(aa);
Print(ba1 ? "ba1 ok" : "ba1 bad cast"); // bad cast
B* ba2 = aa; // здесь неконтролируемый вылетPrint(ba2 ? "ba2 ok" : "ba2 bad cast");
}
Видно, что dynamic cast включен в неявный каст
НО
во-первых непонятно зачем он включен если в языке dynamic cast явно присутствует
во-вторых он включен очень плохо, потому что ошибку dynamic cast в случае функции можно контролировать (на выходе плохой указатель), а неявный каст нельзя! потому что он бросает неконтролируемое исключение
2018.11.23 20:31:47.348 test (AUDNZD,M5) incorrect casting of pointers in 'test.mq5' (17,11)
толку от него такого ровно ноль.
надо или давать невалидный указатель, как функция, или исключить dynamic cast из неявного каста и давать ошибку компиляции.
Да, при наличии этой проблемы, работа с ООП плохо контролируема и ненадёжна. Где-то поменял тип в одном месте программы, а потом рванёт неизвестно где. В данных примерах ещё можно как-то выкрутиться с помощью костылей, т.к. тут простое присвоение указателей, и всё перед глазами. А в общем случае, когда указатель передаётся в какую-то функцию и динамически кастится неизвестно к чему, то уже никак не проконтролируешь.
Предлагаю не спорить, а просто поверить мне, что это ошибка.
Этот глагол слабо применим на техническом форуме. Попробовал C++
Ни один из вариантов не прокатил. Причины не ясны.
Если сделать их взаимозаменяемыми, тогда они оба просто не нужны.
В C++ возможно такое:
Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)
Почему в MQL до сих пор не исправлен баг, что базовый класс неявно приводится к производному классу? Даже предупреждения компилятора нет!
вы ждете ошибки компиляции? так ее не должно быть, потому что в данном случае это dynamic_cast
Cмотрите выше, fxsaber привёл C++ код.
компилится
компилится
Вы невнимательны
или вы. давайте сразу по делу
Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)
В таком виде он не нужен ни завтра ни через 10 лет. И внешняя схожесть не нужна, нужны возможности.
Чтоб хотя бы частично перенести STL из C++. А там дело не упирается только в operator->, там ещё много чего нужно.
operator-> был бы первым шагом на пути к умным указателям.
На самом деле с неявным кастом в том виде в котором он сейчас все не очень хорошо.
Видно, что dynamic cast включен в неявный каст
НО
во-первых непонятно зачем он включен если в языке dynamic cast явно присутствует
во-вторых он включен очень плохо, потому что ошибку dynamic cast в случае функции можно контролировать (на выходе плохой указатель), а неявный каст нельзя! потому что он бросает неконтролируемое исключение
2018.11.23 20:31:47.348 test (AUDNZD,M5) incorrect casting of pointers in 'test.mq5' (17,11)
толку от него такого ровно ноль.
надо или давать невалидный указатель, как функция, или исключить dynamic cast из неявного каста и давать ошибку компиляции.
Да, при наличии этой проблемы, работа с ООП плохо контролируема и ненадёжна. Где-то поменял тип в одном месте программы, а потом рванёт неизвестно где. В данных примерах ещё можно как-то выкрутиться с помощью костылей, т.к. тут простое присвоение указателей, и всё перед глазами. А в общем случае, когда указатель передаётся в какую-то функцию и динамически кастится неизвестно к чему, то уже никак не проконтролируешь.