调用函数的歧义。隐式转换?

Ambiguity in calling function. Implicit conversion?

#include <string>

void f(std::string&& rref){
}

void f(std::string s){ 
}

int main() {
    std::string s = "s";
    f(std::move(s));
}

此代码导致歧义,我不知道为什么,也许,我明确转换为 rvalue 引用。

我的想法是 rvalue 引用可以隐式转换为 lvalue。 但我不确定。请解释。

std::string 可以从 std::string 类型的右值初始化。所以第二个函数是候选

有值和 rvalue-reference 重载不是一个可行的想法。更正常的设置是 rvalue-reference 和 lvalue-reference 重载:

void f(std::string&& rref);
void f(std::string & lref);   // or const&

这将涵盖所有用例。