Я отвечал этот вопрос когда я подумал об этом примере:
#include <iostream>
void func(int i);
void func();
int main (){
func();
return 0;
}
void func(){}
В приведенном выше примере код компилируется нормально. Однако в приведенном ниже примере код компилируется неправильно:
#include <iostream>
void func();
int func();
int main (){
func();
return 0;
}
void func(){}
Это ошибка, которая возникает при компиляции этого кода (в clang ++):
file.cpp:4:5: error: functions that differ only in their return type cannot be
overloaded
int func();
Я ожидал бы ошибку как это оба раза.
Я немного повозился с кодом, и по какой-то совершенно странной причине кажется, что компоновщик полностью игнорирует некорректные объявления. Теперь это позволяет некоторым очень странный код Например, этот заголовочный файл будет легальным:
#ifndef EXAMPLE
#define EXAMPLE
void func();
void func(int a);
void func(int b);
void func(int a, int b);
void func(int a, short b);
void func(int w);
void func(short b);
#endif
Зачем? Почему в мире все это работает? Это просто стандартная ошибка C ++? Сбой компилятора? «Особенность»? Актуальная особенность? (Это все один вопрос, кстати.)
Постскриптум Пока я жду ответа, я собираюсь воспользоваться этим для предварительного добавления функций в код, которые, вероятно, окажутся в производстве.
Первый — перегрузка функции, имена аргументов не учитываются (типы аргументов или их количество различны).
Второе — переопределение функции (типы аргументов и количество одинаковы) с измененным типом возврата, который запрещен. Перегрузка только возвращаемого типа не допускается. Это сказал вам компилятор.
Других решений пока нет …