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

 
fxsaber:
Вы бы запустили сначала. Ошибка ТОЛЬКО здесьВсе вызовы до этого проходят без проблем.

А вот это - действительно странно. В плюсах здесь ошибка во всех трёх вызовах.

Это из другой оперы.

Да нет, всё из той же. Посмотрел вызовы методов в дебаггере: закомментировал последний вызов в вашем примере, поставил точки останова на обоих методах класса и запустил отладку. С метода void func(const int&) точка останова была удалена, т.е. компилятор выкинул этот метод, поэтому неоднозначность была устранена.  А если вызывать функцию с константным аргументом, тогда, видимо, компилятор метод со ссылкой не удаляет, и в результате - неразрешимая перегрузка... Как-то так. В любом случае, в С++ ваш код - ошибочный.

 

Sergei Vladimirov:

В любом случае, в С++ ваш код - ошибочный.

В mql есть дополнительные замуты со ссылками. В любом случае мне не нравится поведение в коде сверху.

void f(const int& x)
{}

void OnStart()
{
   f(5); // ошибка
}
 
Sergei Vladimirov:

А вот это - действительно странно. В плюсах здесь ошибка во всех трёх вызовах.

В данном случае не хотелось бы совсем, чтобы были изменения в сторону С++.
 
Комбинатор:

В mql есть дополнительные замуты со ссылками. В любом случае мне не нравится поведение в коде сверху.

void f(const int& x)
{}

void OnStart()
{
   f(5); // ошибка
}
Здесь ошибка корректна.
 
fxsaber:
В данном случае не хотелось бы совсем, чтобы были изменения в сторону С++.

А вот это уже - вопрос холиварный дискуссионный. Я вам просто ответил, "где собака порылась".

Поведение, кстати, от С++ не отличается, просто если оставить только первые два вызова, то компилятор выкидывает одну из функций, поэтому неопределённость исчезает. Но это же всё равно ошибка, просто автоматически исправляемая компилятором. 

 
fxsaber:
Здесь ошибка корректна.
Да, но в моем понимании ее не должно быть вообще )
 
Sergei Vladimirov:
А вот это уже - вопрос холиварный дискуссионный. :) Я вам просто ответил, "где собака порылась".

Да нет там на самом деле никакой собаки. Приоритет в overload можно поставить в компиляторе, как это сделали разработчики с первыми двумя вызовами.

 
fxsaber:

Да нет там на самом деле никакой собаки. Приоритет в overload можно поставить в компиляторе, как это сделали разработчики с первыми двумя вызовами.

Ну, а в третьем - не сделали. Я всё равно настаиваю, что этот пример - ошибка программиста. Хорошо, конечно, что компилятор часть таких ошибок исправляет, но это всё равно ошибки.
 
Комбинатор:
Да, но в моем понимании ее не должно быть вообще )
Хотите сказать, что компилятор должен был догадаться для f(5) вызвать это?
void f(const int x)
Мы где-то это с Вами недавно обсуждали на примере производительности OnBookEvent.
 
Sergei Vladimirov:
Ну, а в третьем - не сделали. Я всё равно настаиваю, что этот пример - ошибка программиста. Хорошо, конечно, что компилятор часть таких ошибок исправляет, но это всё равно ошибки.
Это не ошибка, а особенность языка. Которую вполне резонно использовать, раз уж она имеется.