2013-10-09 2 views
7

C++ 11을 사용하여지도의지도를 초기화하려고합니다. 내 컴파일러는 VS 2013 Express입니다.VS에서 초기화 목록이있는지도의지도 초기화

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 
}; 

컴파일 중이지만 ntdll.dll 내부에 중단 점이 있습니다. 이 코드의 단순화 된 버전은

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

입니다.

왜지도에 두 개 이상의 쌍이있을 때 이것이 작동하지 않습니까? 그것을 더 잘하는 방법?

+0

"ntdll.dll에서 중단 점을 얻고 있습니다."너무 막연합니다. 단언이 있습니까? 그렇다면 그 주장은 무엇을 말하고 있는가? – thelamb

+0

하지만 그렇게 보입니다. 초기화 목록의 끝을 가리키는 중단 점을 얻고 있으며 그 뒤에는 분해 만 있습니다. 디버그 모드에서는 동일하지만 std :: pair, std :: map, (disassembly), std :: _ Tree를 통해 stacktrace를 얻고 있습니다. 파일 xtree 줄 327에서 끝납니다 : _DEBUG_ERROR ("map/set iterators 호환 불능 "); – omikron

+0

좋아, 그럼 지금은 더 이상 도울 수 없어. 나중에 시간이 있다면. 할 수있는 일은 온라인 컴파일러를 사용하여 코드가 실행되는지 확인하는 것입니다 (예 : G ++ 또는 Clang ++ 사용). 그렇다면 VS2013 버그 일 수 있습니다. 단지 코드를 보면서 나는 무엇이 잘못되었는지 보지 못합니다. – thelamb

답변

17

이것은 알려진 컴파일러 버그 http://connect.microsoft.com/VisualStudio/feedback/details/800104/입니다. 컴파일러는 이니셜 라이저 목록의 임시 객체에 혼란을 느끼고 개별 객체를 반복적으로 파기 할 수도 있습니다. 이것은 침묵하는 나쁜 codegen이기 때문에 컴파일러 팀에게이 문제를 우선적으로 해결하도록 요청했습니다.

+0

나는 어떤 종류의 버그라고 생각했다. 감사! – omikron

+0

'struct X {void foo (/*****/ std :: string const & data = {});}로 선언 된 함수로 같은 버그 (?)를 만났다고 생각합니다. }'. 'data'가 기본값으로 호출되면 무작위 적으로 충돌하지만 항상 그런 것은 아닙니다. 나는 이것이 똑같은 버그 일 수 있다고 맞습니까? _ [또한, 핫픽스의 기회가 있습니까?] _ – sehe

+1

어쨌든, 나는 이것이 다른 버그일지도 모른다고 생각합니다. 관심이있는 경우 최소한의 재생기가 있습니다. ** [질문 : VC12의 (알려진) 컴파일러 버그?] (http://stackoverflow.com/questions/21044488/known-compiler-bug-in-vc12) ** – sehe