2013-10-09 1 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

Но это похоже на то, что я получаю точку останова, указывающую на конец списка инициализации, и позади есть только разборка. В режиме отладки это одно и то же, но я получаю stacktrace через std :: pair, std :: map, (дизассемблирование), std :: _ Дерево несколько раз и заканчивается в файле xtree line 327: _DEBUG_ERROR ("map/set iterators несовместимый "); – omikron

+0

Хорошо, тогда я боюсь, что больше не могу помочь в данный момент. Если у меня будет время позже. Что вы можете сделать, он использует какой-то онлайн-компилятор, чтобы узнать, работает ли там код (например, с помощью G ++ или Clang ++). Если это так, это может быть ошибка VS2013. Просто взглянув на код, я не вижу, что не так. – thelamb

ответ

17

Это известная ошибка компилятора, http://connect.microsoft.com/VisualStudio/feedback/details/800104/. Компилятор запутывается временными в списках инициализаторов и может даже уничтожать отдельный объект повторно. Поскольку это бесшумный плохой кодеген, я попросил команду компилятора установить приоритет по исправлению этого.

+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