2014-05-22 8 views
9

consideri codice semplice frammento diErrore di sintassi nel costruttore presa argomento di default `std :: map`

#include <map> 
#include <string> 


struct Foo 
{ 
    Foo(const std::map<std::string, int> & bar = std::map<std::string, int>()) 
     :bar(bar) 
    { } 

    std::map<std::string, int> bar; 
}; 

int main(int argc, char ** argv) 
{ 
    return 0; 
} 

Quando compilo in questo modo: clang++ -o foo foo.cpp mi faccia errori:

foo.cpp:7:73: error: expected ')' 
    Foo(const std::map<std::string, int> bar = std::map<std::string, int>()) 
                     ^
foo.cpp:7:8: note: to match this '(' 
    Foo(const std::map<std::string, int> bar = std::map<std::string, int>()) 
    ^
foo.cpp:7:68: error: expected '>' 
    Foo(const std::map<std::string, int> bar = std::map<std::string, int>()) 
                   ^

stesso comportamento per clang 3.2 e clang 3.3.

Quindi mi chiedo se mi manca qualcosa o è un bug? GCC non si lamenta.

+0

Puoi provare '{}' invece di '()' ? – stefan

+0

Sì, sembra che ci sia un bug nelle tue versioni di clang. Testato con clang versione 3.5.0 (trunk 203891) e funziona perfettamente. –

+0

Compila in glang ++ 3.5 (pre-3.5 dalla scorsa settimana o giù di lì) e gcc 4.8.2, oltre a clang 2.9 e g ++ 4.6.3. Quali sono tutti i compilatori che ho sulla mia macchina corrente ... –

risposta

2

È un errore nella grammatica C++ che ti sorprenderà. Non sono sicuro che ciò sia stato risolto o eliminato, vedi sotto.

Tutti i principali compilatori lo accettano però, incluse le versioni più recenti di Clang.

Un elenco di riferimenti relativi alla questione:

+0

Wow ... gwiazdorrr

+0

Quindi, essendo un tipo paranoico standard, mi chiedo. È il pezzo di codice è considerato essere vaild. Se non lo è, verrà risolto nel prossimo standard C++ in modo che diventi valido? – GreenScape

+0

@ GreenScape: non posso dire dai commenti del gruppo di lavoro. Il percorso sicuro è usare un typedef, IMHO. In ogni caso, ciò non sarà una cattiva pratica, anche se dovresti semplicemente usare 'map_string_int = std :: map ;'. È ancora incredibile per me che la grammatica proibisca questo. – rubenvb

Problemi correlati