Почему компилятор не обнаруживает правильную сигнатуру функции в ошибке?

Вопрос относится к this , который был опубликован немного раньше. .
В то время как ОП был счастлив принять ответ, который решил его проблему, я был немного заинтригован подробностями о том, почему компилятор выдал, казалось бы, неправильную ошибку.

Ниже приведен небольшой пример кода, который я создал, чтобы продемонстрировать то же самое:

    class YourClass
    {
    };

    class YourClass2
    {
    };
    class MyClass
    {
        public:
            void doSomething(YourClass2 obj)
            {
                //Nothing more Interesting to do
            }

    };

    int main()
    {
        YourClass *ptr = new YourClass();
        MyClass obj;
        obj.doSomething(ptr);

        return 0;
    }

Компиляция этого с GCC (4.3.4) дает, казалось бы, странный результат ошибки:

prog.cpp: In function ‘int main()’:
prog.cpp:23: error: no matching function for call to ‘MyClass::doSomething(YourClass*&)’
prog.cpp:13: note: candidates are: void MyClass::doSomething(YourClass2)

Итак, вопрос:
Почему компилятор обрабатывает вызов

obj.doSomething(ptr);

как вызов функции с прототипом

MyClass::doSomething(YourClass*&)

, а не

MyClass::doSomething(YourClass*)

, что кажется очевидным случаем.

7
задан Community 23 May 2017 в 12:19
поделиться