Is the following code legal in C++?
void f(void* = 0)
{}
int main()
{
f();
}
Which page of the C++ standard states that this usage is lega
Yes, it's perfectly legal. An obvious example is found in N3485 8.3.6 Default Arguments/4:
[Example: the declaration
void point(int = 3, int = 4);
declares a function that can be called with zero, one, or two arguments of type int.
Yes, it's legal.
There is no standard wording to allow this combination of features specifically; there simply isn't any to disallow it, either.
Default argument syntax applies to function parameters in a parameter-declaration:
[C++11: 8.3.6/1]:
If an initializer-clause is specified in a parameter-declaration this initializer-clause is used as a default argument. Default arguments will be used in calls where trailing arguments are missing.
...and function parameters in a parameter-declaration may be unnamed:
[C++11: 8.3.5/11]:
[..] An identifier can optionally be provided as a parameter name. [..]
There is even an example of this usage under 8.3.6/4 (though examples are not normative text, so this cannot be used to prove anything concretely).
Yes, it is legal.
The syntax productions given for function parameters in clause 8.3.5/1 allow a parameter declaration without an identifier, but with an assignment expression (as initialiser).
Not only is it legal, it could actually be quite useful depending on your coding style.
Default parameters are only meaningful in a function declaration.
Named parameters are only meaningful in a function definition.
f.h:
void f(void*=nullptr);
f.cc
void f(void* x)
{
...
}