Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 212
no_use123 Avatar asked Mar 25 '16 16:03

no_use123


1 Answers

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.

like image 176
Barry Avatar answered Oct 14 '22 13:10

Barry