Нарушение безопасности типов в C++ с объявлением функций другого типа?
Я новичок в C++ и просто попробовать вещи. Я придерживался следующего кода:
#include<iostream>
void t(){
std::cout << "func t()" << std::endl;
}
int main(int argc, char **argv) {
int t(); //declaration of function
std::cout << t() << std::endl;
}
вывод "func t ()n6295712". Мое беспокойство-случайное(?) номер, напечатанный t ().
мой вопрос: почему разрешено объявлять функцию другого типа возврата (здесь: int вместо void) без каких-либо ошибок? Не является ли это нарушением безопасности типов, потому что я никогда не определял функцию с возвращаемым типом "int"?
используемый компилятор: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
1 ответов
единственное, что я могу найти-это запись в [basic.масштаб.pdecl]:
объявления функций в области блока и объявления переменных со спецификатором extern в области блока ссылаются на объявления, являющиеся членами заключительного пространства имен, но они не вводят новые имена в эту область.
поэтому, когда вы пишете:
void t();
int main() {
int t(); // *
}
это внутреннее объявление относится к члену заключительного пространства имен. Так это эквивалентно написанию:
void t();
int t();
int main() {}
но функции не могут перегружаться только в возвращаемом типе, поэтому этот код плохо сформирован. Clang отвергает обе программы, gcc отвергает только последнюю. Я считаю, что это ошибка gcc.