Multiple function declarations (C++ only)
All function declarations for a particular function must have the same number and type of parameters, and must have the same return type.
These return and parameter types are part of the function type, although the default arguments and exception specifications are not.
If a previous declaration of an object or function is visible in an enclosing scope, the identifier has the same linkage as the first declaration. However, a variable or function that has no linkage and later declared with a linkage specifier will have the linkage you have specified.
For the purposes of argument matching, ellipsis and linkage keywords
are considered a part of the function type. They must be used consistently
in all declarations of a function. If the only difference between
the parameter types in two declarations is in the use of typedef names
or unspecified argument array bounds, the declarations are the same. A const or volatile type
qualifier is also part of the function type, but can only be part
of a declaration or definition of a nonstatic member function.
int foo(const string &bar);
int foo(const string &);void f();
int f(); // error, two definitions differ only in
// return type
int g()
{
return f();
}