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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With