std :: vector <std :: pair <const int, const int>> :: clear () VS 2010 без компиляции

0

Следующий код не компилируется в Visual Studio 2010. Почему?

#include <vector>
#include <tuple>

int main() {
    std::vector<std::pair<const int, const int> > myVec;
    for(int i=0; i<88; ++i)
        myVec.push_back(std::make_pair<const int, const int>(1,i));
    myVec.clear();
    return 0;
}

Если я оставлю строку, которая очищает вектор, он отлично работает. Мне нужен пустой myVec. Невозможно стереть. pop_back работает. std :: swap - нет.

Теги:
visual-studio-2010

1 ответ

3

Очистка операций над вектором требует, чтобы тип элемента удовлетворял MoveAssignable (см. Таблицу 100 в [C++11: 23.2.3]), которую пара const int явно не делает.

Таким образом, ваша программа недействительна C++.

Не храните const элементы. Выставляйте вектор как const если хотите.

  • 0
    Я проверил только последнюю общедоступную рабочую копию. open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf Для него не требуется MoveAssignable. Зачем вам что-то перемещать в vector :: clear ()? Стандарт действительно отличается?
  • 0
    программа компилируется в g ++ std :: pair <const int, const int> является MoveAssignable, по крайней мере, это могут быть std :: move () - ed и std :: is_move_assignable <std :: pair <const int, const int>>: : значение истинно.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню