As per this link on the 'static' keyword in C++ :
The static keyword is only used with the declaration of a static member, inside the class definition, but not with the definition of that static member.
Why is the static keyword prohibited on member function definitions? I do understand that re-declaring a function as 'static' at its definition is redundant. But using it should be harmless during compilation of the function definition as it does not result in any kind of ambiguity. So why do compilers prohibit it?
The point is, that
static
has several, very different meanings:Here the
static
keyword means that the functionbar
is associated with the classFoo
, but it is not called on an instance ofFoo
. This meaning ofstatic
is strongly connected to object orientation. However, the declarationmeans something very different: It means that
bar
is only visible in file scope, the function cannot be called directly from other compilation units.You see, if you say
static
in the class declaration, it does not make any sense to later restrict the function to file scope. And if you have astatic
function (with file scope), it does not make sense to publish it as part of a class definition in a public header file. The two meanings are so different, that they practically exclude each other.static
has even more, distinct meanings:is another meaning, that is similar, but not identical to
When programming, words don't always the same meaning in all contexts.
Wild guess but if the definition has static it could be interpreted as a file-scope variable in the C sense.
You have to understand the difference between declaration and implementation, and that will answer your question:
Declaration: Is how C++ functions and methods are seen before compiling the program. It's put in a header file (.h file).
Implementation: Is how the compiler links a declaration to a real task in binary code. The implementation can be compiled on the fly (from source files, .cpp or .cxx or .cc), or can be already compiled (from shared libraries or object files).
Now going back to your question, when you declare something as static, it's something not related to the implementation, but related to how the compiler sees the decleration while compiling the code. For example, if you label functions in source files "static", then that's meaningless, because that information cannot be carried to compiled objects and shared libraries. Why allow it? On the contrary, it could only cause ambiguity.
For the exact same reason, default parameters must go into the header, not the source files. Because source files (that contain implementations), cannot carry the default parameter information to a compiled object.
There's ambiguity alright. The same definition need not be for a member function at all.
Consider this:
foo::bar
is required to be defined with the same linkage specifier.For member functions, however,
static
is not a linkage specifier. If it was allowed, the correctness of the definition offoo::bar
will be very very context dependent on whatfoo
is. Disallowingstatic
in fact eases the burden on the compiler.Extending it to members in general, as opposed to just member functions, is a matter of consistency.