¿por qué los argumentos predeterminados en C++ son los finales?¿por qué los argumentos predeterminados son los finales?
Respuesta
si tuviera void func(int a = 0, int b);
, ¿cómo especificaría utilizar el parámetro predeterminado para llamar a esta función?
Sé que no se puede en C++, pero otros lenguajes lo manejan con 'func (, some_val_for_b)', o parámetros nombrados. –
@Dominic Rodger: para mí eso se ve realmente feo. – dierre
@Dominic Rodger, bueno, C++ no. Si lo desea, puede demandar a Stroupstroup: P –
Porque en una llamada de función tiene que llamar a los argumentos no predeterminados en cualquier caso. Si coloca su argumento predeterminado al principio de la lista de argumentos, ¿cómo se supone que debe decir que está configurando el argumento predeterminado o los otros?
¿Qué es lo que hace que el comienzo de una lista sea tan diferente desde el final de la lista? ¡Las listas son simétricas! –
Sí, pero imagine esto: void func (int a, int b = 0, int c, int d = 0); ¿Qué estás haciendo cuando llamas a func (1, 2, 3); –
¿Y qué extremo de la lista, exactamente, está 'b' en? –
Solo para complementar la respuesta de @ tenfour. Preguntas frecuentes sobre C++ Lite tiene un tema que describe named parameters y creo que el tema aborda su problema hasta cierto punto.
Porque así es como se ha diseñado el lenguaje.
Una pregunta más interesante sería: ¿cuáles son las alternativas?
Suponga que tiene void f(A a = MyA, B b);
- marcador de posición/argumento en blanco:
f(_, abee)
of(, abee)
- argumentos con nombre (como en Python):
f(b = abee)
pero esas son sutilezas y ciertamente no es necesario, porque a diferencia de Python, C++ admite la sobrecarga de funciones:
void f(A a, B b);
void f(B b) { f(MyA, b); }
y por lo tanto los argumentos por defecto son innecesarias ... sobre todo teniendo en cuenta que hay problemas cuando se utiliza con OO-código, porque los argumentos por defecto se resuelven de forma estática (en tiempo de compilación)
struct Base
{
virtual void func(int g = 3);
};
struct Derived
{
virtual void func(int g = 4);
};
int main(int argc, char* argv[])
{
Derived d;
d.func(); // Derived::func invoked with g == 4
Base& b = d;
b.func(); // Derived::func invoked with g == 3 (AH !!)
}
EDIT: de parámetros con nombre ->
El la característica se puede emular usando objetos de función.
class Func
{
public:
Func(B b): mA(MyA), mB(b) {}
A& a(A a) { mA = a; }
B& b(B b) { mB = b; }
void operator()() { func(mA, mB); }
private:
A mA;
B mB;
};
int main(int argc, char* argv[])
{
A a; B b;
Func(b)();
Func(b).a(a)();
}
En caso de que no desea copiar los argumentos, usted tiene la posibilidad de utilizar referencias/punteros aunque puede complicarse.
Es un modismo práctico cuando tiene un montón de valores predeterminados sin un orden de prioridad real.
La sobrecarga de funciones no ayuda si 'A' y' B' son del mismo tipo ... –
@Oli: ¿por qué? dado el primer prototipo de 'func', está claro que si hay un solo parámetro, entonces el valor predeterminado debe usarse para el primer parámetro, cualquiera que sea su tipo. Sin embargo, las cosas se ponen feas cuando tienes dos valores predeterminados;) En general, los parámetros nombrados son lo único que puede resolver el problema, y lo mejor es que son una solución en tiempo de compilación. –
Sí, tienes razón. Pensé que estabas usando sobrecarga para eliminar la ambigüedad de 'func (A a, B b)', 'func (B b)' * y * 'func (A a)'. –
- 1. ¿Cuáles son los repositorios predeterminados de leiningen?
- 2. ¿Qué son los corchetes angulares para los valores de los argumentos y para qué se utilizan?
- 3. ¿Los argumentos 'por ref' en WCF son incorrectos o buenos?
- 4. typedef una plantilla con todos los argumentos predeterminados
- 5. ¿Por qué los valores de parámetro predeterminados de Ruby no se asignan a argumentos nulos?
- 6. ¿Por qué los argumentos predeterminados se evalúan en tiempo de definición en Python?
- 7. ¿Por qué el compilador no puede deducir el tipo de plantilla de los argumentos predeterminados?
- 8. ¿Cuáles son los argumentos para main() para?
- 9. Los argumentos literales definidos por el usuario no son constexpr?
- 10. ¿Por qué todos los campos en una interfaz son implícitamente estáticos y finales?
- 11. argumentos predeterminados para estructuras
- 12. java @SafeVarargs por qué los métodos privados deben ser finales
- 13. ¿Qué tan costosos son los argumentos del puntero NULL?
- 14. ¿Cuáles son los argumentos para sysctl()?
- 15. OCaml: valores predeterminados para los argumentos de función?
- 16. Orden de argumentos predeterminados y no predeterminados
- 17. ¿Por qué los vectores son tan superficiales?
- 18. Scala: ¿Por qué los actores son livianos?
- 19. ¿Por qué son importantes los árboles binarios?
- 20. ¿Por qué los objetos Joda son inmutables?
- 21. ¿Por qué los globales son malos?
- 22. por qué los marcos son malos
- 23. Por qué los puntos son lentos
- 24. ¿Por qué los iframes son tan lentos?
- 25. ¿Los argumentos NULL son una mala práctica?
- 26. ¿Cuáles son los valores predeterminados para @property en iOS?
- 27. ¿Cuáles son todos los tipos de empaque maven predeterminados?
- 28. ¿Cómo puedo establecer los argumentos predeterminados para "ls" en Linux?
- 29. ¿Por qué los EJB son seguros y los servlets no?
- 30. ¿Por qué Perl permite pasar los argumentos por referencia?
La respuesta que seleccionó no responde a su pregunta en absoluto. – juanchopanza