¿Por qué C++ no admite parámetros con nombre? [closed]

4 minutos de lectura

avatar de usuario
Jobín

Anteriormente, trabajé con Python. En Python, utilicé parámetros con nombre (argumento de palabra clave) para las llamadas a funciones. La página de Wikipedia sobre parámetros con nombre dice que C++ no lo admite. ¿Por qué C++ no admite parámetros con nombre? ¿Lo admitirá en una versión futura del estándar C++?

  • [FYI] Hay una propuesta: open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm

    – NathanOliver

    28 de junio de 2016 a las 12:56

  • Ha habido al menos una propuesta para ellos. Puede intentar investigar por qué no es parte del estándar.

    – chris

    28 de junio de 2016 a las 12:56

  • No se trata de programar, sino de una decisión.

    – nbro

    28 de junio de 2016 a las 12:56

  • Incluso Fortran introdujo parámetros con nombre con Fortran 95. Hay cierta discusión sobre Reddit sobre propuesta n4172parece que la razón para abandonarlo es que las declaraciones de funciones son perfectamente válidas sin usar nombres de parámetros (p. ej. void foo(int, int);) y, como consecuencia, diferentes implementaciones de la misma biblioteca (STL) pueden usar diferentes nombres de parámetros.

    – André Holzner

    2 sep 2018 a las 18:29

  • @ Anonymous1847 hmmm idk, tal vez me estoy perdiendo algo, pero parece que no sería demasiado difícil de resolver por completo en el momento de la compilación. El argumento ordenado actual debe representarse en alguna parte como una lista indexada de tipos. Asigne una enumeración en tiempo de compilación a esos. luego, el compilador puede reorganizar los argumentos con nombre por índice de acuerdo con el valor constante. eso debería permitir la deducción de tipo simple y evitar cualquier cambio en el código compilado. trabajando efectivamente como un alias

    – Ese programador de bienes raíces

    16 de agosto de 2021 a las 10:41

avatar de usuario
erorika

¿Por qué C++ no admite parámetros con nombre?

Porque tal característica no se ha introducido en el estándar. La función tampoco existía (y no existe) en C, que es en lo que se basó originalmente C++.

¿Lo admitirá en una versión futura del estándar C++?

Una propuesta fue escrito para ello. Pero la propuesta fue rechazada.

Un problema fundamental en C++ es que los nombres de los parámetros en las declaraciones de funciones no son significativos y el siguiente programa está bien definido:

void foo(int x, int y);
void foo(int y, int x);   // re-declaration of the same function
void foo(int, int);       // parameter names are optional
void foo(int a, int b) {} // definition of the same function

Si se introdujeran parámetros con nombre en el lenguaje, ¿qué parámetros se pasarían aquí?

foo(x=42, b=42);

Los parámetros con nombre requieren un sistema de paso de parámetros significativamente diferente e incompatible con versiones anteriores.


Puede emular parámetros con nombre utilizando un solo parámetro de tipo de clase:

struct args {
    int   a = 42;
    float b = 3.14;
};

void foo(args);

// usage
args a{};
a.b = 10.1;
foo(a);
// or in C++20
foo({.b = 10.1});

  • Esto es lo que esta página tiene que decir con respecto a la propuesta: Discussed in Urbana. EWG found various problems with the proposed approach, and didn't think it's feasible to try solving the problem, as it has been tried many times and every time it has failed..

    – Ruslán

    28 de mayo de 2017 a las 6:13

  • CppCon 2018 Charla “Argumentos nombrados desde cero” por Richard Powell podría ser útil.

    – Benjamín Buch

    13 de noviembre de 2018 a las 22:03

  • Me gusta esta función, aclara el código, todavía no existe tal función en C++ 17

    – Dee

    16 mayo 2019 a las 22:58

  • @Andrés They are supported now No, no lo son. Del artículo que vinculaste: C++ is obviously not such a language and there have been numerous proposals to rectify this omission, unfortunately none of them successful. Pasar todos los argumentos como una sola clase siempre ha sido una solución para lograr un objetivo similar. Con inicializadores designados, se ha convertido en una emulación muy cercana de los verdaderos parámetros con nombre.

    – erorika

    4 de febrero de 2021 a las 9:23

  • @Andrés They're real named parameters No, no lo son. Son realmente variables miembro. It's very convenient Si bien es cierto, eso no los convierte en parámetros con nombre. this serves the overall purpose and function of named parameters. Solo algo de eso. Puede usar el argumento de clase única para hacer que sus propias funciones emulen parámetros con nombre, pero eso no le permite pasar parámetros con nombre a funciones que no fueron declaradas de esa manera.

    – erorika

    4 de febrero de 2021 a las 14:29


¿Ha sido útil esta solución?