Su código (simplificado):
struct X
{
int mem;
void f(int param = mem); //ERROR
};
Usted desea utilizar un conjunto de datos miembros no estáticos como valor predeterminado para un parámetro de una función miembro La primera pregunta que viene. a la mente es este: que instan específico ce de la clase pertenece al valor predeterminado mem
?
X x1 = {100}; //mem = 100
X x2 = {200}; //mem = 200
x1.f(); //param is 100 or 200? or something else?
Su respuesta podría ser 100
como f()
se invoca en el objeto que tiene x1
mem = 100
. Si es así, entonces se requiere la aplicación de implementar f()
como:
void f(X* this, int param = this->mem);
que a su vez requiere que el primer argumento que ser inicializado antes de la inicialización de otro argumento. Pero el estándar de C++ no especifica ningún orden de inicialización de los argumentos de la función. Por lo tanto, eso no está permitido. Su por la misma razón que el C++ estándar no permite siquiera esto:
int f(int a, int b = a); //§8.3.6/9
De hecho, § 8.3.6/9 dice explícitamente,
Los argumentos predeterminados se evalúan cada vez que se llama a la función. El orden de la evaluación de los argumentos de la función es no especificado. En consecuencia, los parámetros de una función no se deben usar en expresiones de argumentos por defecto, incluso si no se evalúan.
Y el resto de la sección es una lectura interesante.
Un tema interesante relacionado con argumentos "por defecto" (no relacionados con este tema, aunque):
posible duplicado de [C++ miembro de la clase heredada públicamente no se puede utilizar como argumento predeterminado] (http://stackoverflow.com/questions/2159538/c-publicly-herited-class-member-cannot-be-used-as-default-argument) – marcog
@marcog: Aunque puedo estar de acuerdo, esto está relacionado de alguna manera , pero creo que esto no es un duplicado en absoluto ... –
Esto es problema de C++: D –