En parámetros sin nombre a funciones, C ++

El siguiente es un código C++ perfectamente legal

 void foo (int) { cout << "Yo!" << endl; } int main (int argc, char const *argv[]) { foo(5); return 0; } 

Me pregunto, si hay algún valor para dejar los parámetros sin nombre en las funciones, dado el hecho de que no se pueden hacer referencia desde dentro de la función.

¿Por qué es esto legal para comenzar?

Sí, esto es legal Esto es útil para implementaciones de virtuales de la clase base en implementaciones que no pretenden utilizar el parámetro correspondiente: debe declarar el parámetro para que coincida con la firma de la función virtual en la clase base, pero no tiene previsto utilizarlo, por lo que no especifica el nombre.

El otro caso común es cuando proporciona una callback a alguna biblioteca, y debe ajustarse a una firma que la biblioteca haya establecido (gracias, Aasmund Eldhuset por mencionar esto).

También hay un caso especial para definir sus propios operadores de post-incremento y post-decremento : deben tener una firma con un parámetro int , pero ese parámetro siempre está sin usar. Sin embargo, esta convención linda con un truco en el diseño del lenguaje.

Por supuesto, no nombrar un parámetro es legal cuando se acaba de declarar la función, pero también es legal en la implementación. Esta última versión aparentemente extraña es útil cuando la función necesita declarar que el parámetro tiene una firma fija específica, pero el parámetro no es necesario.

Esto puede suceder, por ejemplo, para un método en una clase derivada, para una función de callback o para un parámetro de plantilla.

No darle un nombre al parámetro deja en claro que el parámetro no es necesario y su valor no será utilizado. Algunos comstackdores si, en cambio, nombras un parámetro y luego simplemente no lo usas, emitirán una advertencia de que posiblemente haya un problema con el cuerpo de la función.

Solo quiero agregar que a veces hay una diferencia si nombra un parámetro o no. Por ejemplo, el comstackdor trata una referencia rvalue nombrada como un valor l y una referencia rvalue sin nombre como un valor r.

 // named-reference.cpp // Compile with: /EHsc #include  using namespace std; // A class that contains a memory resource. class MemoryBlock { // TODO: Add resources for the class here. }; void g(const MemoryBlock&) { cout << "In g(const MemoryBlock&)." << endl; } void g(MemoryBlock&&) { cout << "In g(MemoryBlock&&)." << endl; } MemoryBlock&& f(MemoryBlock&& block) { g(block); return block; } int main() { g(f(MemoryBlock())); } 

Este ejemplo produce el siguiente resultado:

En g (const MemoryBlock &).
En g (MemoryBlock &&).

En este ejemplo, la función principal pasa un valor r a f . El cuerpo de f trata su parámetro nombrado como un valor l. La llamada de f a g vincula el parámetro a una referencia lvalue (la primera versión sobrecargada de g ).