ссылка на итератор не компилируется в visual studio 2017 - PullRequest
0 голосов
/ 14 ноября 2018

В моем проекте в Visual C ++ в Visual Studio 2015 я использовал ссылки на итераторы.

Сегодня я обновился до vs2017, но, похоже, компилятор изменился больше, чем я думал.Надеюсь, я смогу решить большинство проблем, но некоторые я не знаю, почему это изменится.

Например, я использовал фрагмент

for (auto& it = stack.begin(); it != stack.end() /* not hoisted */; /* no increment */)
    {
        if (it->second->empty()) { stack.erase(it++); }    // or "it = m.erase(it)" since C++11
        else
        {
            auto obj = move(it->second);
            stack.erase(it);
            return move(obj);
        }
    }

, где stack - это std::map<float, std::unique_ptr<StackableObj>.

Раньше все работало нормально, но в vs2017 не компилируется, вместо этого выдается ошибка типа

Error   C2440   'initializing': cannot convert from 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>' to 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &'.

Что мне делать с этим или где искать, чтобы узнатьчто изменилось?Попытка гуглить некоторые термины не дала никаких конкретных ответов на происходящее.

Заранее спасибо

1 Ответ

0 голосов
/ 14 ноября 2018

Неконстантная ссылка на значение недопустима. См. this для получения дополнительной информации по теме:

По умолчанию компилятор не может связать неконстантную или изменчивую ссылку lvalue с rvalue.

Наиболее оптимальным решением здесь является удаление &, поскольку копирование итераторов обходится дешево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...