Некоторый фон:
Однажды я столкнулся с чем-то, что заставило меня задуматься о разрешении перегрузки в вызовах вложенных функций. Рассмотрим код ниже:
#include <iostream>
void printer(const int &a)
{
std::cout << a << "\n";
}
const int& func(const int &a)
{
std::cout << "const int& ";
return a;
}
int& func(int &a)
{
std::cout << "int& ";
return a;
}
int main()
{
int a = 42;
const int b = 21;
printer(func(a));
printer(func(b));
return 0;
}
Этот код печатает
int& 42
const int& 21
Итак, func (a), очевидно, видит, что a неконстантное int. Компилятор также должен видеть, что функция принтера хочет получить const int & аргумент. И существует функция (...), которая возвращает const int &. Я посмотрел на стандарт C ++, и он говорит, что const refs и refs считаются разными типами параметров (и именно поэтому он выбирает int & for func (a)).
К вопросу:
Разрешено ли компилятору использовать версию func (const int &) вместо func (int &) при вызове func (a)?
(Возможно, существует некоторая возможность оптимизации, если он видит, что результат передается функции, требующей const int & параметр.)