Задать вопрос
@tema86

Учитывается ли тип значения, возвращаемого функцией, в решении о выборе нужной версии перегруженной функции?

Здравствуйте, читаю книгу Герберта Шилдта "Руководство для начинающих".
Есть такой пример :

#include <iostream>
using namespace std;

void f(int x);
void f(short x);
void f(double x);

int main() {
        int i = 10;
        double d = 10.1;
        short s = 99;
        float r = 11.5F;

        f(i);
        f(d);
        f(s);
        f(r);

        return 0;
}

void f(int x) {
        cout << "В функции f(int): " << x << "\n";
}

void f(short x) {
        cout << "В функции f(short): " << x << "\n";
}

void f(double x) {
        cout << "В функции f(double): " << x << "\n";
}


Результаты:

В функции f(int): 10
В функции f(double): 10.1
В функции f(short): 99
В функции f(double): 11.5

В конце главы проводится проверка знаний и есть такой вопрос:

Учитывается ли тип значения, возвращаемого функцией, в решении о выборе нужной версии перегруженной функции?

Ниже на него есть ответ:

Нет, типы значений, возвращаемых функциями, могут различаться, но это различие не влияет на решение о выборе нужной версии.

-------------------

Собственно у меня и появился вопрос, почему не учитывается тип данных для выбора версии перегруженной функции, когда после приведения к типу double из float и происходит выбор функции f(double x)?
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
В C++ есть неявное приведение типов. Какую функцию вызывать, если точно такого же прототипа нет?
float foo() { ... };
double foo(){ ... };

int bar()
{
    int k=foo(); ///?????
    ...
}


Ответа нет. Поэтому - фокус не удастся.
Ответ написан
@MarkusD Куратор тега C++
все время мелю чепуху :)
Стандартом продиктовано что функции могут перегружаться только параметрами.
eel.is/c++draft/over#2

В то же время, стандартом описано что функция не может быть перегружена только лишь изменением возвращаемого значения.
eel.is/c++draft/over.load#2

А вот пояснения зарыты глубоко в 13м параграфе стандарта и отрыть их там наскоро не выйдет.
eel.is/c++draft/#over
И дело там не только в неявных приведениях типа. Проблем с разрешением перегрузки или инстанциирования шаблона только по возвращаемому значению выше крыши.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы