歧义调用(从char*到lambda与std::string的转换)

Ambiguous call (conversion from char* to lambda vs std::string)

本文关键字:std string 转换 lambda 调用 char 歧义      更新时间:2023-10-16

根据我的编译器gcc-4.6,在下面的例子中调用func是模棱两可的

void func(const std::string &str) {
}
void func(std::function<std::string()> f) {
}
void test() {
    func("Hello");
}

编译器这样说正确吗?如果我移除第一个重载,这段代码将无法编译,因为它将无法实例化所涉及的模板。

除了重命名两个函数之一或显式转换为std::string之外,是否有其他方法可以解决这个问题?

可以在std::function的构造函数中使用SFINAE进行解析。然而,它似乎不是必需的,也不是GCC提供的。所以你不能完全依赖于它的运行

您还可以添加第三个重载来显式捕获字符串文本大小写:

void func(char const* cstr) {
    return func(std::string(cstr));
}