c++ - ¿Argumento predeterminado en medio de la lista de parámetros?
default-arguments (2)
Ese código funcionaría si en la primera declaración de la función, el último parámetro tiene un valor predeterminado, algo como esto:
//declaration
void error(char const *msg, bool showKind, bool exit = false);
Y luego, en el mismo ámbito , puede proporcionar valores predeterminados para otros argumentos (desde el lado derecho), en la declaración posterior, como:
void error(char const *msg, bool showKind = true, bool exit); //okay
//void error(char const *msg = 0 , bool showKind, bool exit); // error
que se puede llamar como:
error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);
Demostración en línea: http://ideone.com/aFpUn
Tenga en cuenta que si proporciona un valor predeterminado para el primer parámetro (desde la izquierda), sin proporcionar un valor predeterminado para el segundo, no se compilaría (como se esperaba): http://ideone.com/5hj46
§8.3.6 / 4 dice,
Para funciones que no son de plantilla, los argumentos predeterminados se pueden agregar en declaraciones posteriores de una función en el mismo ámbito.
Ejemplo de la norma misma:
void f(int, int);
void f(int, int = 7);
La segunda declaración agrega valor por defecto!
Ver también §8.3.6 / 6.
Vi una declaración de función en nuestro código que se ve como sigue
void error(char const *msg, bool showKind = true, bool exit);
Primero pensé que esto es un error porque no puedes tener argumentos predeterminados en medio de las funciones, pero el compilador aceptó esta declaración. ¿Alguien ha visto esto antes? Estoy usando GCC4.5. ¿Es esta una extensión de GCC?
Lo extraño es que, si saco esto en un archivo separado y trato de compilar, GCC lo rechaza. He comprobado todo, incluidas las opciones de compilación utilizadas.
La respuesta podría estar en 8.3.6:
8.3.6 Argumentos predeterminados
6 Excepto las funciones miembro de las plantillas de clase, los argumentos predeterminados en una definición de función miembro que aparecen fuera de la definición de clase se agregan al conjunto de argumentos predeterminados proporcionados por la declaración de función miembro en la definición de clase. Los argumentos predeterminados para una función miembro de una plantilla de clase se especificarán en la declaración inicial de la función miembro dentro de la plantilla de clase.
Ejemplo:
class C { void f(int i = 3); void g(int i, int j = 99); }; void C::f(int i = 3) // error: default argument already { } // specified in class scope void C::g(int i = 88, int j) // in this translation unit, { } // C::g can be called with no argument
Después de leer esto, encontré que MSVC10 aceptó lo siguiente con las extensiones del compilador desactivadas:
void error(char const* msg, bool showKind, bool exit = false);
void error(char const* msg, bool showKind = false, bool exit)
{
msg;
showKind;
exit;
}
int main()
{
error("hello");
}