fxsaber: Вы бы запустили сначала. Ошибка ТОЛЬКО здесьВсе вызовы до этого проходят без проблем.
А вот это - действительно странно. В плюсах здесь ошибка во всех трёх вызовах.
Это из другой оперы.
Да нет, всё из той же. Посмотрел вызовы методов в дебаггере: закомментировал последний вызов в вашем примере, поставил точки останова на обоих методах класса и запустил отладку. С метода void func(const int&) точка останова была удалена, т.е. компилятор выкинул этот метод, поэтому неоднозначность была устранена. А если вызывать функцию с константным аргументом, тогда, видимо, компилятор метод со ссылкой не удаляет, и в результате - неразрешимая перегрузка... Как-то так. В любом случае, в С++ ваш код - ошибочный.
fxsaber: В данном случае не хотелось бы совсем, чтобы были изменения в сторону С++.
А вот это уже - вопрос холиварный дискуссионный. Я вам просто ответил, "где собака порылась".
Поведение, кстати, от С++ не отличается, просто если оставить только первые два вызова, то компилятор выкидывает одну из функций, поэтому неопределённость исчезает. Но это же всё равно ошибка, просто автоматически исправляемая компилятором.
Да нет там на самом деле никакой собаки. Приоритет в overload можно поставить в компиляторе, как это сделали разработчики с первыми двумя вызовами.
Ну, а в третьем - не сделали. Я всё равно настаиваю, что этот пример - ошибка программиста. Хорошо, конечно, что компилятор часть таких ошибок исправляет, но это всё равно ошибки.
Sergei Vladimirov: Ну, а в третьем - не сделали. Я всё равно настаиваю, что этот пример - ошибка программиста. Хорошо, конечно, что компилятор часть таких ошибок исправляет, но это всё равно ошибки.
Это не ошибка, а особенность языка. Которую вполне резонно использовать, раз уж она имеется.
Вы бы запустили сначала. Ошибка ТОЛЬКО здесьВсе вызовы до этого проходят без проблем.
А вот это - действительно странно. В плюсах здесь ошибка во всех трёх вызовах.
Это из другой оперы.
Да нет, всё из той же. Посмотрел вызовы методов в дебаггере: закомментировал последний вызов в вашем примере, поставил точки останова на обоих методах класса и запустил отладку. С метода void func(const int&) точка останова была удалена, т.е. компилятор выкинул этот метод, поэтому неоднозначность была устранена. А если вызывать функцию с константным аргументом, тогда, видимо, компилятор метод со ссылкой не удаляет, и в результате - неразрешимая перегрузка... Как-то так. В любом случае, в С++ ваш код - ошибочный.
Sergei Vladimirov:
В любом случае, в С++ ваш код - ошибочный.
В mql есть дополнительные замуты со ссылками. В любом случае мне не нравится поведение в коде сверху.
А вот это - действительно странно. В плюсах здесь ошибка во всех трёх вызовах.
В mql есть дополнительные замуты со ссылками. В любом случае мне не нравится поведение в коде сверху.
В данном случае не хотелось бы совсем, чтобы были изменения в сторону С++.
А вот это уже - вопрос холиварный дискуссионный. Я вам просто ответил, "где собака порылась".
Поведение, кстати, от С++ не отличается, просто если оставить только первые два вызова, то компилятор выкидывает одну из функций, поэтому неопределённость исчезает. Но это же всё равно ошибка, просто автоматически исправляемая компилятором.
Здесь ошибка корректна.
А вот это уже - вопрос холиварный дискуссионный. :) Я вам просто ответил, "где собака порылась".
Да нет там на самом деле никакой собаки. Приоритет в overload можно поставить в компиляторе, как это сделали разработчики с первыми двумя вызовами.
Да нет там на самом деле никакой собаки. Приоритет в overload можно поставить в компиляторе, как это сделали разработчики с первыми двумя вызовами.
Да, но в моем понимании ее не должно быть вообще )
Ну, а в третьем - не сделали. Я всё равно настаиваю, что этот пример - ошибка программиста. Хорошо, конечно, что компилятор часть таких ошибок исправляет, но это всё равно ошибки.