2012-10-10 21 views
5

El siguiente código no se compilará. ¿Por qué?No es posible: este puntero como argumento predeterminado. ¿Por qué?

class A 
{ 
    int j; 
    void f(int i = this->j); 
} 

Editar, para mayor claridad. Esto es lo que estaba tratando de hacer, utilizando menos líneas de código ...

class A 
{ 
    void f(int i){}; 
    void f(); 
    int j; 
}; 

void A::f() 
{ 
    f(j); 
} 
+2

¿Qué estás tratando de hacer aquí? –

+3

Porque la instancia no está en el alcance dentro de la declaración de argumento ...? –

+2

"... La expresión puede combinar funciones que son visibles en el ámbito actual, las expresiones constantes y las variables globales. La expresión no puede contener variables locales o variables de miembros de clase no estáticos ..." –

Respuesta

6

Los valores de los argumentos predeterminados están vinculados en tiempo de compilación.

"esto" solo se define en tiempo de ejecución, por lo que no se puede utilizar.

ver aquí para una explicación más completa: Must default function parameters be constant in C++?

+0

, pero ¿por qué se diseñó C++ de esta manera, que los argumentos predeterminados deben vincularse en tiempo compilado? ... – alexandreC

+0

@alexandreC esa es otra pregunta. –

0

Otros ya han comentado sobre la razón de que esto no funciona. De uno de los comentarios:

" ... La expresión puede combinar funciones que son visibles en el ámbito actual , expresiones constantes y variables globales La expresión no puede contener variables locales o de clase no estática. miembro de las variables ..."

Usted podría utilizar optional para eliminar la función adicional aunque no estoy seguro de que es más claro:

void f(boost::optional<int> i = boost::none) { if(!i) i = j; ... }

Cuestiones relacionadas