Проверка времени компиляции для использования итератора?

У меня есть следующий фрагмент неосторожного кода C ++, который компилируется без сбоев под VC10, но с треском проваливается во время выполнения. Мне интересно, есть ли способ проверить этот вид ошибки во время компиляции?

#include "stdafx.h"#include <set>

void minus(std::set<int>& lhs, const std::set<int>& rhs)
{
for ( auto i = rhs.cbegin(); i != rhs.cend(); ++i )
{
lhs.erase(i); // !!! while I meant "*i" !!!
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int v_lhs[] = {0,1,2,3,4,5};
std::set<int> s_lhs(&v_lhs[0], &v_lhs[sizeof(v_lhs) / sizeof(int)]);

int v_rhs[] = {1,3,5};
std::set<int> s_rhs(&v_rhs[0], &v_rhs[sizeof(v_rhs) / sizeof(int)]);

minus(s_lhs, s_rhs);
return 0;
}

Обратите внимание, что я полностью осознаю, что C ++ 11 (частично принятый ранее VC10) исправил поведение, которое «стирание» фактически принимает «const_iterator».

Заранее спасибо за любые ценные материалы.

1

Решение

C ++ не является языком чтения мыслей. Все, что он знает, это типы. Это знает что erase занимает итератор. И это знает, что i является итератором того же типа. Следовательно, что касается правил компилятора C ++, то законно erase(i),

Для компилятора нет возможности узнать, что вы означало сделать. Компилятору также не известно, что содержание из i не подходят для этого конкретного использования erase, Лучше всего стараться избегать ошибок. Диапазон на основе for (или использование std::for_each) поможет вам в этом, поскольку оба они скрывают итератор.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]