¿Puede un parámetro sin nombre de la función tener un valor predeterminado?

¿Es el siguiente código legal en C ++?

void f(void* = 0) {} int main() { f(); } 

¿Qué página del estándar C ++ indica que este uso es legal?

Sí, es legal.

No hay una redacción estándar para permitir esta combinación de características específicamente; simplemente no hay ninguno que lo rechace , tampoco.

La syntax predeterminada de los argumentos se aplica a los parámetros de función en una statement de parámetros :

[C++11: 8.3.6/1]: Si se especifica una cláusula de inicialización en una statement de parámetros, esta cláusula de inicialización se utiliza como un argumento predeterminado. Los argumentos predeterminados se utilizarán en las llamadas donde faltan los argumentos finales.

… y los parámetros de función en una statement de parámetros pueden ser sin nombre:

[C++11: 8.3.5/11]: [..] Un identi fi cador puede proporcionarse opcionalmente como nombre de parámetro. [..]

Incluso hay un ejemplo de este uso en 8.3.6 / 4 (aunque los ejemplos no son textos normativos, por lo que no se puede usar para probar nada en concreto).

Sí, es perfectamente legal. Un ejemplo obvio se encuentra en N3485 8.3.6 Argumentos predeterminados / 4:

[Ejemplo: la statement

 void point(int = 3, int = 4); 

declara una función que se puede llamar con cero, uno o dos argumentos de tipo int.

Sí, es legal.
Las producciones de syntax dadas para los parámetros de función en la cláusula 8.3.5 / 1 permiten una statement de parámetros sin un identificador, pero con una expresión de asignación (como inicializador).

No solo es legal, sino que puede ser bastante útil dependiendo de su estilo de encoding.

Los parámetros por defecto solo son significativos en una statement de función.

Los parámetros nombrados solo son significativos en una definición de función.

fh

 void f(void*=nullptr); 

f.cc

 void f(void* x) { ... }