Нарушение безопасности типов в 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.