C++ 传递迭代器与指向函数的指针

C++ pass iterator vs. pointer to function

提问人:StefanoSavarino 提问时间:10/9/2023 最后编辑:StefanoSavarino 更新时间:10/9/2023 访问量:102

问:

我正在编写一个递归函数,该函数循环列表列表。 这是函数的标头:

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 *&'

我有一种感觉,这是因为该函数通过引用来获取第一个元素,但我无法真正解释为什么(这里有点初学者......

提前致谢!

C++ 指针迭代 按引用传递

评论

1赞 Some programmer dude 10/9/2023
第一项任务是学会使用指针。我看不出您的代码中有任何理由使用指针。但我确实认为需要更多地使用引用,例如 ,并直接使用而不使用指针运算符。此外,这可能也不应该是一个指针。for (auto const& dir : current_dir_ptr->children)dir&current_dir_ptr
1赞 Some programmer dude 10/9/2023
请注意,range for 循环实际上不会遍历迭代器。至少你无权访问语句可能使用的迭代器。在你的循环中,不是一个迭代器。it
3赞 pptaszni 10/9/2023
您的编译器错误消息不是关于将引用绑定到临时的吗?当问题是关于不编译代码时,始终包含编译器错误消息。
0赞 Ted Lyngmo 10/9/2023
请展示一个最小的可重复示例,这样我们就不必猜测了。
0赞 pptaszni 10/9/2023
看一看 - 它与您的代码相同,只是更短。不能将右值(临时值,即 )绑定到左值引用。&it

答:

3赞 Sam Varshavchik 10/9/2023 #1

函数的参数是 which 是引用。它是对指针的引用,但这是次要细节,它是先于其他任何内容的引用。Directory *&

在 C++ 中,引用不能绑定到 prvalue。在不太正式、稍微不精确的术语中,您不能将大多数类型的表达式作为引用参数传递。这只是 C++ 的规则之一,没有例外或解决方法。

&it是生成指针的表达式。它不能绑定到引用。

ptr是一个左值,一个命名对象。C++ 中允许创建对命名对象的引用。