2012-12-10 13 views
11

Quando utilizzo la notazione di richiamo del costruttore (declare-) che definisce un puntatore al puntatore (invece della notazione di assegnazione - ovviamente che farà la stessa cosa in fase di esecuzione, è solo una convenzione), ricevo un errore del compilatore. Mi stavo chiedendo perché questo sia.Perché è illegale definire un puntatore alla variabile puntatore con la notazione di richiamo del costruttore?

struct Foo 
{ /* ... */ }; 

int main(int argc, char** argv) 
{ 
    Foo* parFoo = new Foo[2]; 
    Foo** ppFoo(&parFoo); // invalid: C2059 
    Foo** ppFoo = &parFoo; // OK 

    delete[] parFoo; 
} 

L'errore è un C2059 - token non valido, che non dice molto. Tuttavia, lo & non è il problema (il che significa che probabilmente non è un errore di precedenza dell'operatore). Se faccio la seguente:

int main(int argc, char** argv) 
{ 
    Foo* parFoo = new Foo[2]; 
    Foo** ppFoo = &parFoo; // OK 
    Foo** ppFoo2(ppFoo); // invalid: C2061 

    delete[] parFoo; 
} 

... poi ho un C2061, il che significa che questa volta è l'identificatore ppFoo che è nel posto sbagliato.

Quale regola sintattica provoca questo, ovvero perché non è possibile utilizzare la notazione di richiamo del costruttore per definire i puntatori ai puntatori, solo i tipi "meno indicativi"?

+4

[Works for me] (http://ideone.com/OlIPKZ). Forse questa è una cosa di VisualC++. –

+1

Primo esempio compilato bene usando ideone.com (gcc suppongo). Per quanto riguarda il secondo, probabilmente hai fatto un errore, dovresti essere Foo ** ppFoo2 (ppFoo)? <- nota ppFoo. Beh, in realtà c'è anche un errore nel primo esempio (nomi duplicati), ma questo è minore. – queen3

+0

@ queen3 +1 per il suggerimento di ideone.com, è abbastanza bello e per individuare l'errore di battitura. risolto ora; il problema persiste – zyndor

risposta

12

Sembra un C++ valido. E, come altri hanno sottolineato, GCC lo accetta. Come si ottiene dall'errore del compilatore, sembra un errore nel parser di MSVC.

Infatti aggiungendo parentesi aiuta ad analizzare il codice correttamente:

Foo* parFoo = new Foo[2]; 
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too 
+0

Si tratta di un bug segnalato? – nullpotent

+0

Grazie per la risposta e per la soluzione alternativa. – zyndor

+0

@ricthedral: non ne ho idea. – ybungalobill

2

In VS2005 il codice può essere ridotta ad un semplice

int main() { 
    int** ppFoo(0); 
} 

e genera lo stesso errore. Ovviamente è un bug nel compilatore.

Problemi correlati