станд :: MultiMap:: rbegin указывает на конец () в MSVS-13? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть особая проблема, которая заставляет мою команду беспокоиться об использовании std :: chrono.

Мы работаем с MSVS-13, поэтому C ++ 11.

У меня естьколлекция состояний объекта, хранящаяся в мультикарте, с ключом std: chrono :: milliseconds.Я хочу найти последний раз (наибольшее значение ключа продолжительности) на карте.Очевидный ответ - использовать rbegin ():

class ObjectState{};
typedef std::multimap<std::chrono::milliseconds, ObjectState> MapType
main()
{
    MapType stateMap;

    // add some states

    // read the last time
    std::chrono::milliseconds lastTime = stateMap.rbegin()->first;
}

Но в моей сборке это ядра.Глядя на отладчик, кажется, что rbegin () указывает на недопустимое местоположение после карты, как должен делать end ().

И я подтвердил, что увеличение итератора, возвращаемого rbegin (), действительно достигаетпоследний элемент на карте.

Все, что я прочитал, говорит, что оно не должно так себя вести, и если я наберу карту "double" вместо "std :: chrono :: milliseconds", то rbegin () -> first дает наибольшее время, как я и ожидал.

Есть ли какая-то причина для несовместимости std :: chrono и std :: multimap?

1 Ответ

0 голосов
/ 15 октября 2018
std::chrono::milliseconds lastTime = stateMap.rbegin()->first;

это приводит к неопределенному поведению, если:

  1. stateMap пусто

  2. Кто-то изменил данные внутри stateMapэто меняет порядок.

  3. Любой, кто-либо в программе выполнял или будет выполнять неопределенное поведение до или после этой строки кода.

В противном случае, он возвращает наибольшее значение ключа, хранящееся в stateMap.

...