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

时间:2016-01-08 21:40:57

标签: c++ c++11 move-semantics overload-resolution

#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 。 但我不确定。请解释一下。

1 个答案:

答案 0 :(得分:4)

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

拥有值和rvalue-reference重载是不可行的。更正常的设置是使用rvalue-reference和lvalue-reference重载:

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

这将涵盖所有用例。