Баг компилятора: неверный приоритет кастинга

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Navoykov
4571
Alexey Navoykov  

Ошибка компилятора.  В приведённом коде он не может определиться между даун-кастом (который всегда разрешён неявно), и ап-кастом (который вообще недопустим в неявном виде в других языках).  Если уж в MQL по какой-то причине разрешают неявный ап-каст (что само по себе ошибка), то он хотя бы должен иметь приоритет ниже, чем у даун-каста.

class A { };
class B : public A { };
class C : public B { };

void f(A*) { };
void f(C*) { }

void OnInit()
{
  B*b;
  f(b); // 'f' - ambiguous call to overloaded function
}

В C++ естественно всё компилируется нормально.

Alexey Navoykov
4571
Alexey Navoykov  

В продолжение темы.  Оказывается, даже в случае только даункастов компилятор не может выбрать вариант:

class A { };
class B : public A { };
class C : public B { };

void f(A*) { }
void f(B*) { }

void OnInit()
{
  C*c;
  f(c); // 'f' - ambiguous call to overloaded function
}
TheXpert
18277
TheXpert  

На подумать

void f (int) {}
void f (long) {}

void OnStart()
{
   short l;
   f(l);
}
Alexey Navoykov
4571
Alexey Navoykov  
TheXpert:

На подумать

О чём думать то? )  С такими случаями здесь всё в порядке вроде.   И объекты классов тоже кастятся правильно.  Проблема только с указателями.

p.s. Хотя не, вру, с объектами тоже не всё в порядке. Во втором случае с ними компилятор тоже не может определиться.  Но зато хоть по первому случаю правильно отрабатывает, никакого ап-кастинга делать не пытается, и это радует )

TheXpert
18277
TheXpert  
Alexey Navoykov:

О чём думать то? ) 

если честно, я не понимаю почему это в плюсах не считается ошибкой.

pavlick_
773
pavlick_  
TheXpert:

если честно, я не понимаю почему это в плюсах не считается ошибкой.

short -> int - Integral promotion

short -> long - Integral conversion

У первого приоритет выше.

Alexey Navoykov
4571
Alexey Navoykov  
TheXpert:

если честно, я не понимаю почему это в плюсах не считается ошибкой.

Если long 32 битный, то действительно может быть неоднозначность.  В противном случае всё очевидно вроде
pavlick_
773
pavlick_  
Alexey Navoykov:
Если long 32 битный, то действительно может быть неоднозначность.  В противном случае всё очевидно вроде

нет, тут размер не главное :). Первое всегда - promotion, второе - conversion.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий