Violation of type safety in C++ with function declaration of other type?

I am new to C++ and just try out stuff. I stuck with the following code:

#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;
}

The output is "func t()n6295712". My concern is the random(?) number printed by t().

My question is: Why is it allowed to declare a function of another return-type (here: int instead of void) without any error? Is this not a violation of type safety because I never defined a function with a return-type "int"?

Used compiler: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4


The only relevant thing I can find is a note in [basic.scope.pdecl]:

Function declarations at block scope and variable declarations with the extern specifier at block scope refer to declarations that are members of an enclosing namespace, but they do not introduce new names into that scope.

So when you write:

void t();

int main() {
    int t();  // *
}

That inner declaration refers to a member of the enclosing namespace. So it's equivalent to having written:

void t();
int t();

int main() {}

But functions cannot overload solely in return type, so this code is ill-formed. Clang rejects both programs, gcc only rejects the latter. I believe this is a gcc bug.

链接地址: http://www.djcxy.com/p/90996.html

上一篇: 具有高级过滤功能的2 ^ n Itertools组合

下一篇: 在C ++中违反类型安全与其他类型的函数声明?