调用函数的歧义.隐式转换

Ambiguity in calling function. Implicit conversion?

本文关键字:转换 歧义 函数 调用      更新时间:2023-10-16
#include <string>
void f(std::string&& rref){
}
void f(std::string s){ 
}
int main() {
    std::string s = "s";
    f(std::move(s));
}

这段代码会导致歧义,我不知道为什么我显式转换为右值引用。

我的想法是,右值引用可以隐式转换为左值。但我不确定。请解释一下。

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

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

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

这将涵盖所有用例。