Кодов ниже:Перегрузки функции с другим идентичными подписями, чтобы принять как ссылку и константную ссылку
struct A {};
void f (A& a) {std::cout << "No const" << std::endl;}
void f (const A& a) {std::cout << "const" << std::endl;}
int main(){
f(A()); // indicated as line A, output will be "const".
}
Вопрос 1):
Почему выходной линия A
«s„Const“, хотя A()
является неконстантным объектом?
Я считаю, что компилятор производит код, эквивалентный:
const A tempA;
f(tempA);
Является ли это правильно?
Вопрос 2), если две функции F изменяются, как показано ниже, изменение ссылки на тип значения
void f (A a) {std::cout << "No const" << std::endl;}
void f (const A a) {std::cout << "const" << std::endl;}
Приведенные выше коды не могут быть собраны. Компилятор выдает ошибки «переопределения функции f». Я могу понять, почему ошибка была выдана компилятором, потому что можно преобразовать const A
в A
и наоборот. Таким образом, во время компиляции невозможно решить. Это правильно ?
Мне все еще очень любопытно, что это очень хорошо определено в спецификации C++?
Большое спасибо за ваш ответ. Я получаю его. –