No, el valor predeterminado argumento no es parte de la firma y no es parte del tipo de función.
El tipo de parámetro es una parte de la firma. Pero el tipo de argumento predeterminado no tiene ningún efecto de tipo de parámetro, es decir, el tipo de argumento predeterminado no tiene efecto en la firma.
Los argumentos predeterminados no se "almacenan" en ningún lugar específicamente. Los argumentos predeterminados son "azúcar sintáctico" que existe (como argumentos predeterminados) solo durante la compilación del programa. Si durante el compilador de compilación se da cuenta de que falta algún argumento, usará el argumento predeterminado, tal como lo haya especificado usted. La evaluación del argumento predeterminado se realiza en el contexto de la persona que llama. Si especifica un objeto temporal como argumento predeterminado, se creará un elemento temporal por separado cada vez que llame a la función utilizando el argumento predeterminado y se destruirá inmediatamente después de que finalice la expresión de llamada.
void foo(T t = T());
// A new temporary will be used as an argument every time you call it as `foo()`
foo();
// Equivalent to `foo(T())`. A temporary is created here, passed as an argument and
// destroyed afterwards, just like an explicit temporary would be
Si especifica un objeto existente con una duración de almacenamiento estático como un argumento predeterminado, entonces se almacenarán siempre que lo definen.
T global;
void foo(T& t = global);
// In this case you are using a global object as a default argument
// It is you who "store" it wherever you want to store it
foo();
// Equivalent to `foo(global)`
Si se declara argumentos por defecto, pero en realidad nunca se utilicen, es decir, si especifica los argumentos de forma explícita cada vez, entonces el programa compilado tendrá ningún rastro de estos argumentos de ningún tipo (por eso los llamé en tiempo de compilación "azúcar sintáctica").
P.S.Para incluir lo que dice Johannes en el comentario siguiente: aunque el argumento predeterminado (cuando se usa) se evalúa en el contexto de la persona que llama en el momento de la llamada, no se hace por "sustitución textual" como podría aparecer en mis ejemplos encima. En particular, la búsqueda de nombre para los nombres utilizados en los argumentos predeterminados se realiza en el punto en que el argumento predeterminado se especifica en la declaración de la función, no en el punto de la evaluación en la persona que llama.
El argumento predeterminado es algo que existe solo para el compilador. Si omite un parámetro en una llamada a función, el compilador escribirá el código de manera que se pase silenciosamente * como si lo hubiera especificado en la llamada *. Una vez compilado, su programa no tiene ningún concepto real de valores predeterminados, por lo tanto, no están realmente 'almacenados' en ninguna parte. –