警告由于 ADL 导致丢失 std:: 前缀

Fel*_*bek 3 c++ compiler-warnings argument-dependent-lookup clang-tidy

当参数类型位于命名空间中时,可以省略sstd::的命名空间(通常是这种情况)。<algorithm>是否有任何警告或整齐的规则可以发现此类遗漏?

#include <vector>
#include <algorithm>

std::vector<int> v;
for_each(v.begin(), v.end(), [](auto){});
return 0;
Run Code Online (Sandbox Code Playgroud)

上面的示例使用最新的 clang 和 -Wall、-Wextra 和 -Wpedantic 编译,不会发出任何诊断信息:

https://godbolt.org/z/dTsKbbEKe

dfr*_*fri 6

tidy 中有一个开放的更改可以用来标记这一点:

[补丁]总结

此补丁添加了bugprone-unintended-adl不在提供的白名单上使用 ADL 的标记。

容易出错的意外 ADL

查找 ADL(参数相关查找)的用法,或模板情况下的潜在 ADL,这些用法不在所提供的允许标识符和命名空间列表中。[...]

.. 选项::IgnoreOverloadedOperators

如果非零,则忽略使用运算符语法(例如a + b)对重载运算符的调用,但不忽略函数调用语法(例如 operator+(a, b))。默认为1.

.. 选项::AllowedIdentifiers

检查忽略的以分号分隔的名称列表。默认为
swap;make_error_code;make_error_condition;data;begin;end;rbegin;rend;crbegin;crend;size;ssize;empty.

.. 选项::AllowedNamespaces

以分号分隔的命名空间名称列表(例如foo;bar::baz)。如果检查发现解析为该列表中的命名空间中的函数的不合格调用,则该调用将被忽略。默认是一个空列表。

不过,自 2020 年 7 月以来,该补丁似乎没有任何活动,但如果 OP 对此感兴趣,OP 可以尝试恢复该补丁。