关于将迭代器传递给函数的 C++ 令人尴尬的问题

who*_*ami 1 c++ iterator

所以,给定这个函数定义:

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


Run Code Online (Sandbox Code Playgroud)

为什么以下原因会导致distance()函数内部挂起?

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

xx(L, L.begin());
Run Code Online (Sandbox Code Playgroud)

我以为它只会为零。是的,我知道我很烂。

son*_*yao 5

my_list被声明为传值,它是参数的副本。这意味着,给定distance(my_list.begin(),_start);,my_list.begin()_start指向两个不同的std::lists,行为是未定义的。

如果将其更改为按引用传递,则两个迭代器都指向相同std::list的代码,代码就可以了。例如

void xx(list<int>& my_list, list<int>::iterator start){
   
    list<int>::iterator _start = start;
    distance(my_list.begin(),_start);
}
Run Code Online (Sandbox Code Playgroud)