力扣里的代码有一个重要的隐形条件:代码都写在一个类中。这种情况下,凭借 reverse 会先搜索到你自己定义的函数,此时编译器立刻停止进一步的搜索(同时也忽略掉了全局的 using namespace std;),因此 std::reverse 不会加入重载,自然会报错。如果这个函数写在 namespace 或者全局中,虽然搜索还是会在遇到你定义的重名函数后立刻停止,但此时还会发生一步 ADL 查找,这一步会让编译器重启名称查找过程,在 std 命名空间中进行搜索,并且将 std::reverse 加入重载。接下来在重载决议时,编译器便会选中 std::reverse 而抛弃你自己定义的函数,此时编译便能通过。一般来说,推荐无脑加 std:: 前缀,这样一定不会出错,也不再需要关心这些破事。