#include <iostream> class Foo { public: Foo(int=5); }; Foo::Foo(int) { std::cout << "[Foo]"; } int main() { Foo Foo0(); Foo Foo1(1); return 0; //SUCCESS? }And a trivial question: how many times will the Foo constructor execute?
Explanation:
in the above code, line:
Foo Foo0();
is not a declaration of a variable named Foo0 of class Foo initialized with default constructor. Instead, it is, what can be called local function prototyping. More precisely, it is a declaration of a new function, named Foo0, which returns result of type Foo.
It seems to be legacy code after nested functions, supported by GCC C Compiler. See the example:#include <stdio.h> int main() { auto int m_nested(); int m_nested() { return 666; } printf("%d", m_nested()); return 0; }Function m_nested() is nested within another function (main()), and its scope is limited to that surrounding function.
Getting back to the original code, any attempt to access Foo0 will result in error:
int main() { Foo Foo0(); Foo Foo() { //error: a function-definition is not allowed here before '{' token //... }; Foo0(); // error: undefined reference to 'Foo0()' Foo0 = *new Foo(); // error: cannot convert 'Foo' to 'Foo()' in assignment }The only thing, that would make sense and would actually compile is defining this function somewhere else:
//... int main() { // no access to Foo0() here Foo Foo0(); Foo f = Foo0(); //.. do some stuff with 'f' delete &f; return 0; } Foo Foo0() { std::cout << "Foo0()"; return *new Foo(); }Such code will narrow access to Foo0() to the place where it was declared for the first time, and will end as soon as the program leaves the execution block.