2013-10-09 159 views
7

我想用C++ 11初始化映射圖。我的編譯器是VS 2013 Express。在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 
}; 

這是編譯,但我得到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進行堆棧跟蹤並且它結束於文件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

相關問題