使用std::vector<int>::back作为std::ranges::sort投射参数是否可行?
问题解答
这段代码不能正常工作,核心原因是std::vector::back存在两个重载版本:
- 非const成员函数:
reference back(); - const成员函数:
const_reference back() const;
当直接传递&std::vector::back给std::sort时,编译器无法确定要选用哪个重载,因此抛出"unresolved overloaded function type"(未解析的重载函数类型)错误。std::sort的比较参数需要明确、无歧义的函数类型,而重载函数地址本身不具备这种明确性。
正确的解决方式
最直观且无歧义的写法是使用lambda表达式实现排序逻辑:
#include <vector> #include <algorithm> int main() { std::vector<std::vector<int>> vecs = {{1,3}, {2,1}, {3,2}}; // 按子向量最后一个元素升序排序 std::sort(vecs.begin(), vecs.end(), [](const std::vector<int>& a, const std::vector<int>& b) { return a.back() < b.back(); }); return 0; }
如果坚持使用成员函数指针,需要通过模板参数明确指定重载版本,比如借助std::mem_fn绑定const版本:
#include <vector> #include <algorithm> #include <functional> int main() { std::vector<std::vector<int>> vecs = {{1,3}, {2,1}, {3,2}}; std::sort(vecs.begin(), vecs.end(), [](const auto& a, const auto& b) { return std::invoke(std::mem_fn(&std::vector<int>::back), a) < std::invoke(std::mem_fn(&std::vector<int>::back), b); }); return 0; }
内容的提问来源于stack exchange,提问作者user515430
相关产品推荐
相关产品推荐

