用其他类型的函数声明违反C++中的类型安全性?

no_*_*123 7 c++ type-conversion type-safety

我是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;
}
Run Code Online (Sandbox Code Playgroud)

输出为"func t()\n6295712".我担心的是由t()打印的随机(?)数字.

我的问题是:为什么允许声明另一个返回类型的函数(这里:int而不是void)而没有任何错误?这不违反类型安全性,因为我从未定义过具有返回类型"int"的函数吗?

使用的编译器:gcc(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4

Bar*_*rry 4

我能找到的唯一相关的东西是[basic.scope.pdecl]中的注释:

块作用域中的函数声明和块作用域中带有 extern 说明符的变量声明引用作为封闭命名空间成员的声明,但它们不会在该作用域中引入新名称。

所以当你写:

void t();

int main() {
    int t();  // *
}
Run Code Online (Sandbox Code Playgroud)

该内部声明引用封闭名称空间的成员。所以它相当于写了:

void t();
int t();

int main() {}
Run Code Online (Sandbox Code Playgroud)

但函数不能仅在返回类型中重载,因此该代码格式不正确。Clang 拒绝这两个程序,gcc 只拒绝后者。我相信这是一个 gcc 错误。