通用Lambda与通用函数具有不同的行为

bar*_*top 14 c++ lambda c++14

以下面的代码为例

#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);
}
Run Code Online (Sandbox Code Playgroud)

我希望既然已经foo编译,那么也bar将进行编译。令我惊讶的是,foo编译正确,并且bar对sort函数的歧义调用存在问题。我在这里做非法的事情,还是这是编译器应该表现的正确方式?如果是这样,为什么会如此不同。虽然我可以将通用lambda视为通用功能的语法糖。

现场例子

Mic*_*zel 16

这里的问题不是对to的调用sort是模棱两可的,而是名称sort是模棱两可的。名称查找发生在重载解析之前。

我相信相关部分是[basic.lookup] / 1,特别是

[…]通过名称查找找到的声明要么全部表示同一实体,要么全部表示函数或函数模板;在后一种情况下,声明被称为形成了一组重载函数([over.load])。[…]

在您的情况下,名称sort既表示对象又表示boot::sort重载函数集std::sort。因此,名称查找失败。

例如,您的代码实际上与您编写的代码没有什么不同

namespace baz {
    int a;
}

namespace boot {
    int a;
}

void foo() {
    using namespace baz;
    using namespace boot;
    a = 42;  // error: reference to 'a' is ambiguous
}
Run Code Online (Sandbox Code Playgroud)

在这里尝试 ; 将此与实际具有模糊函数调用的情况进行比较; 请注意,错误消息与您的情况相同,特别是指名称本身是模棱两可的,而不是函数调用。