C смущающий вопрос о передаче итераторов функциям

#c #iterator

#c #итератор

Вопрос:

Итак, учитывая это определение функции:

 void xx(list<int> my_list, list<int>::iterator start){
   
    list<int>::iterator _start = start;
    distance(my_list.begin(),_start);
}


 

Почему следующее приводит distance() к зависанию внутри функции?

 list<int> L;
L.push_back(0);
L.push_back(1);

xx(L, L.begin());
 

Я думал, что это будет просто ноль. Да, я знаю, что я отстой.

Ответ №1:

my_list объявляется как передача по значению, это копия из аргумента. Это означает, что, учитывая distance(my_list.begin(),_start); , my_list.begin() и _start указывает на два разных std::list s, поведение не определено.

Если вы измените его на передачу по ссылке, то оба итератора указывают на одно и то же std::list , и код будет в порядке. например

 void xx(list<int>amp; my_list, list<int>::iterator start){
   
    list<int>::iterator _start = start;
    distance(my_list.begin(),_start);
}
 

Комментарии:

1. ХА-ХА. Вау. Сегодня я слишком долго был на терминале. Мне пора ложиться спать. Блин.

2. Пожалуйста, нажмите зеленую галочку, если это отвечает на ваш вопрос.