提问人:StefanoSavarino 提问时间:10/9/2023 最后编辑:StefanoSavarino 更新时间:10/9/2023 访问量:102
C++ 传递迭代器与指向函数的指针
C++ pass iterator vs. pointer to function
问:
我正在编写一个递归函数,该函数循环列表列表。 这是函数的标头:
void findDirToDelete(Directory*& current_dir_ptr, Directory*& dir_to_delete, int space_to_free) {
这是在这个问题的上下文中有趣的函数部分:
Directory* ptr = nullptr;
for (auto it : current_dir_ptr->children) {
ptr = ⁢
findDirToDelete(ptr, dir_to_delete, space_to_free);
}
此代码将编译并运行。
除其他属性外,类 Directory 还包含一个元素。list<Directory> children
我的问题是,为什么上面的代码是编译的,而不是下面的代码?
for (auto it : current_dir_ptr->children) {
findDirToDelete(&it, dir_to_delete, space_to_free);
}
这是我得到的编译错误:
'void findDirToDelete(Directory *&,Directory *&,int)': cannot convert argument 1 from 'Directory *' to 'Directory *&'
我有一种感觉,这是因为该函数通过引用来获取第一个元素,但我无法真正解释为什么(这里有点初学者......
提前致谢!
答:
3赞
Sam Varshavchik
10/9/2023
#1
函数的参数是 which 是引用。它是对指针的引用,但这是次要细节,它是先于其他任何内容的引用。Directory *&
在 C++ 中,引用不能绑定到 prvalue。在不太正式、稍微不精确的术语中,您不能将大多数类型的表达式作为引用参数传递。这只是 C++ 的规则之一,没有例外或解决方法。
&it
是生成指针的表达式。它不能绑定到引用。
ptr
是一个左值,一个命名对象。C++ 中允许创建对命名对象的引用。
评论
for (auto const& dir : current_dir_ptr->children)
dir
&
current_dir_ptr
range for
循环实际上不会遍历迭代器。至少你无权访问语句可能使用的迭代器。在你的循环中,不是一个迭代器。it
&it