以下面的代码为例
#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)
在这里尝试 ; 将此与实际具有模糊函数调用的情况进行比较; 请注意,错误消息与您的情况相同,特别是指名称本身是模棱两可的,而不是函数调用。