为何在C++中用std::find查找vector内结构体时必须显式构造对象?
问题原因解析
你遇到的编译错误核心在于C++模板参数推导的规则限制,具体细节如下:
std::find的第三个参数是模板参数const T&,这里的T需要与容器元素类型(即position)匹配。但{x,y}是一个无类型的聚合初始化列表,它本身不属于任何具体类型,C++的模板推导机制不会自动将这种初始化列表隐式转换为position类型——推导过程无法从初始化列表推断出目标类型T,因此找不到匹配的std::find重载。当你写成
position({x,y})时,相当于显式构造了一个position类型的临时对象,此时编译器能明确识别出第三个参数的类型是position,完全匹配std::find对参数类型的要求,因此可以正常编译运行。
额外说明:哪怕你的 position 结构体定义了自定义构造函数(不再是聚合体),直接传 {x,y} 依然会触发同样的推导失败——模板推导不会为了匹配某个类类型而去解析初始化列表,只有当函数参数明确声明为 std::initializer_list<T> 类型时,推导才会针对初始化列表生效。
内容的提问来源于stack exchange,提问作者user43283
相关产品推荐
相关产品推荐

