调用函数的歧义.隐含转换?

J. *_*Doe 8 c++ overload-resolution move-semantics c++11

#include <string>

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

void f(std::string s){ 
}

int main() {
    std::string s = "s";
    f(std::move(s));
}
Run Code Online (Sandbox Code Playgroud)

这段代码引起歧义,我不知道为什么,我可能会明确转换为右值引用.

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

M.M*_*M.M 4

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

具有值和右值引用重载不是一个可行的想法。更正常的设置是具有右值引用和左值引用重载:

void f(std::string&& rref);
void f(std::string & lref);   // or const&
Run Code Online (Sandbox Code Playgroud)

这将涵盖所有用例。