![](/img/trans.png)
[英]What is the difference between passing a pointer to function and passing reference of pointer to function?
[英]What is the difference between passing a container directly vs as a reference into a function?
為什么當作為參數傳遞時,集合似乎不是一對一復制的? 我想這與迭代器指向原始集而創建新的復制集這一事實有關。 所以 s.end() 將指向復制集的結束指針,而不是原始集。 但我不明白下面的非終止輸出。
為什么這會給出“-812375757575757575 ...”的輸出:
#include <iostream>
#include <set>
void f (std::set<int>::iterator itr, std::set<int> s) {
if (itr != s.end()) {
std::cout << *itr;
++itr;
f(itr, s);
}
}
int main() {
std::set<int> s {1, 2, 3, 7, -8};
f(s.begin(), s);
return 0;
}
而這給出了“-81237”的輸出:
#include <iostream>
#include <set>
void f (std::set<int>::iterator itr, std::set<int>& s) {
if (itr != s.end()) {
std::cout << *itr;
++itr;
f(itr, s);
}
}
int main() {
std::set<int> s {1, 2, 3, 7, -8};
f(s.begin(), s);
return 0;
}
第一個代碼表現出未定義的行為。 每次調用f()
時, set
對象都會通過value傳遞,這意味着會生成一個副本。 因此,您最終會比較不屬於同一set
對象的迭代器,即 UB。
第二個代碼通過按引用傳遞原始set
對象來修復該問題,因此不會創建任何副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.