很久以前,我注意到在 Visual C++ 10 中,当至少一个参数是 lambda 时,ADL 会失败。
std::vector<float> vec;
for_each(begin(vec), end(vec), [](float) {});
以上无法在 VC++10 和 11(测试版)上编译(开始和结束通过 ADL 找到)。当我将 lambda 函数转换为常规的自由函数时,事情会按预期工作。
我曾在 Herb Sutters 博客上问过一次问题,还阅读了 msdn connect 上的一些帖子,通常的答案是:这是一个错误,我们还没有实现 lambdas 的最新标准 - 当时 - 是可以理解的。事情还没有完全成型。在 MS Connect 上,也有令人不安的评论,即下一版本即 vc 11 不会解决此问题。
我的问题是,这段代码是否可以在 C++11 标准下工作?我不能完全弄清楚。当我使用 lambdas 时,我真的必须在我的 for_each 和其他算法前面加上 std:: 前缀吗?
我以某种方式怀疑vc++ 11发布后这种行为不会改变。
最佳答案
这是完全有效的代码。任何没有错误的编译器都可以编译它。但是由于 MSVC 有 bug,所以无法通过 ADL 搜索函数,那么也许你不应该依赖 ADL,而是使用 std::
来限定它,帮助编译器找到函数。
关于c++ - 有lambda参数时ADL失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9899907/