使用find_if处理指针vector时如何向lambda传递指针的const引用
问题解决
以下是可正常编译的修正后代码:
#include <algorithm> #include <vector> class obj { public: int a = 5; int b = 2; }; int main() { obj A; obj B; std::vector<obj*> v = { &A, &B }; // 显式指定参数类型写法 auto it = std::find_if(std::begin(v), std::end(v), [](obj* const& instance) { return instance->a == 5; }); // 简化写法:用auto自动推导参数类型,避免手写类型错误 // auto it = std::find_if(std::begin(v), std::end(v), [](const auto& instance) { // return instance->a == 5; // }); }
原代码错误点说明
- 参数类型语法错误
你写的
const (obj*)&是非法语法。存储obj*元素的vector,元素本身是指针类型,要接收元素的const引用,正确写法是obj* const&:
- 离变量名最近的
const修饰指针本身,代表引用绑定的指针不能修改指向- 如果你同时不允许修改指针指向的对象内容,可以写
const obj* const& instance- 更简便的方式是直接用
const auto&接收参数,编译器会自动推导正确类型,避免手写类型的失误
- 成员访问语法错误
instance本身就是obj*类型的指针,直接用instance->a或者(*instance).a就能访问成员a。你写的(*instance)->a属于语法错误:先对指针解引用得到obj对象,再对对象使用->运算符,不符合C++语法规则
- 谓词返回值不全
std::find_if要求传入的谓词必须在所有逻辑分支下都返回bool值,你原来的代码只有满足条件时返回true,不满足条件时没有返回值,会触发编译错误,直接返回比较表达式的布尔结果即可
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

