2012-10-10 29 views
5

Il seguente codice non verrà compilato. Perché?Non possibile: questo puntatore come argomento predefinito. Perché?

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

Modifica, per chiarezza. Questo è quello che stavo cercando di fare, usando meno righe di codice ...

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

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

Cosa stai cercando di fare qui? –

+3

Perché l'istanza non è nell'ambito della dichiarazione argomento ...? –

+2

"... L'espressione può combinare funzioni visibili nell'ambito corrente, espressioni costanti e variabili globali.L'espressione non può contenere variabili locali o variabili membro non classiche membro ..." –

risposta

6

I valori degli argomenti predefiniti sono associati al momento della compilazione.

"questo" è definito solo in fase di esecuzione, quindi non può essere utilizzato.

Vedi qui per una spiegazione più completa: Must default function parameters be constant in C++?

+0

ma perché il C++ è stato progettato in questo modo, che gli argomenti predefiniti devono essere associati al momento della compilazione? ... – alexandreC

+0

@alexandreC è un'altra domanda. –

0

Altri hanno già commentato la ragione per cui questo non funziona. Da uno dei commenti:

" ... L'espressione può combinare le funzioni che sono visibili nella nell'ambito corrente, espressioni costanti e le variabili globali La espressione non può contenere variabili locali o classe- non statico. membro variabili ..."

si potrebbe utilizzare optional per eliminare la funzione aggiuntiva anche se non sono sicuro che sia più chiaro:

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

Problemi correlati