【发布时间】:2019-08-17 10:24:40
【问题描述】:
以下代码为例
#include <algorithm>
namespace baz {
template<class T>
void sort(T&&){}
}
namespace boot {
const auto sort = [](auto &&){};
}
void foo (){
using namespace std;
using namespace baz;
sort(1);
}
void bar(){
using namespace std;
using namespace boot;
sort(1);
}
我预计既然foo 已编译,那么bar 也应编译。令我惊讶的是,foo 编译正确,bar 对sort 函数的模糊调用存在问题。我在这里做一些非法的事情还是编译器应该采取的正确方式?如果是这样,为什么会如此不同。我虽然可以将泛型 lambda 视为泛型函数的语法糖。
【问题讨论】:
-
Lambda 不参与 ADL
-
这不是 ADL。
int参数不来自任何命名空间。 -
这真的应该模棱两可吗?
std::sort()不接受 1 个参数作为输入,它至少需要 2 个,那么为什么编译器甚至将其视为仅传递 1 个参数值的调用的候选者? -
肯定有一些关于 lambda 引入的额外间接层。在第一个示例中,调用
::baz::sort,但在第二个示例中,它必须找到::boot::mystery_lambda_type::operator()。这个额外的步骤可能是导致首先考虑std::sort的原因。我面前没有标准,所以不能确定。