2013-10-09 18 views
7

Sto provando a inizializzare la mappa delle mappe utilizzando C++ 11. Il mio compilatore è VS 2013 Express.Inizializzazione della mappa delle mappe con l'elenco di inizializzazione in VS 2013

unordered_map<EnumType, unordered_map<string, string>> substitutions = { 
    { 
     Record::BasementType, 
     { 
      { "0", "" }, 
      { "1", "Slab or pier" }, 
      { "2", "Crawl" } 
     } 
    }, 
    { 
     Record::BuildingStyle, 
     { 
      { "0", "" }, 
      { "1", "Ranch" }, 
      { "2", "Raised ranch" } 
     } 
    }, 
    // ... and so on 
}; 

È compilato ma sto ricevendo il punto di interruzione all'interno di ntdll.dll. Versione semplificata di questo codice:

unordered_map<EnumType, unordered_map<string, string>> substitutions = { 
    { 
     Record::BasementType, 
     { 
      { "0", "" }, 
      { "1", "Slab or pier" }, 
      { "2", "Crawl" } 
     } 
    }, 
    // *nothing more* 
}; 

funziona correttamente.

Perché questo non funziona quando ho più di una coppia nella mappa? Come si fa meglio?

+0

"I'm getting breakpoint inside ntdll.dll" è troppo vago. C'è un'affermazione? Se è così, cosa dice l'affermazione. – thelamb

+0

Ma sembra così, sto ricevendo il punto di interruzione che punta alla fine della lista di inizializzazione e dietro c'è solo il disassemblaggio. In modalità debug è lo stesso, ma sto ricevendo stacktrace tramite std :: pair, std :: map, (disassembly), std :: _ Tree alcune volte e finisce nel file xtree line 327: _DEBUG_ERROR ("map/set iterators incompatibile"); – omikron

+0

Ok, allora temo di non poterne più aiutare al momento. Se avrò tempo dopo. Quello che puoi fare usa un compilatore online per vedere se il codice viene eseguito lì (ad esempio usando G ++ o Clang ++). Se così fosse potrebbe essere un bug VS2013. Solo guardando il codice non vedo cosa c'è che non va. – thelamb

risposta

17

Questo è un bug del compilatore noto, http://connect.microsoft.com/VisualStudio/feedback/details/800104/. Il compilatore viene confuso dai provvisori negli elenchi di inizializzatori e può persino distruggere ripetutamente un singolo oggetto. Dato che questo è un cattivo codegen, ho chiesto al team del compilatore di dare la priorità alla risoluzione di questo problema.

+0

Ho pensato che fosse una specie di bug. Grazie! – omikron

+0

Penso di aver trovato lo stesso bug (?) Con una funzione dichiarata come 'struct X {void foo (/*..........*/, std :: string const & data = {}); } '. Si blocca casualmente quando viene chiamato con 'data' come predefinito, ma non sempre. Ho ragione potrebbe essere lo stesso bug? _ [Inoltre, c'è una possibilità di un hotfix?] _ – sehe

+1

In ogni caso, penso che questo potrebbe essere un bug diverso. Ecco il riproduttore minimale nel caso tu sia interessato: ** [Domanda: (Known) bug del compilatore in VC12?] (Http://stackoverflow.com/questions/21044488/known-compiler-bug-in-vc12) ** – sehe

Problemi correlati