下面是一个会产生错误的简单示例(VS 2019):
C2664'void foo(std :: string&)':无法将参数1从'std :: string'转换为'std :: string&'
使用命名空间标准;
void foo(string& input) {
cout << "Foo is: " << input << endl;
}
string getInput() {
return string("abc");
}
int main()
{
foo(getInput());
}
我不明白该错误。 getInput()返回一个字符串。为什么不能像引用任何局部变量或成员变量一样将字符串直接传递给foo()函数呢?正如错误消息所暗示的那样,将字符串参数设置为const会使错误消失。为什么会这样?
更新:在考虑了回复和下面发布的几个链接后,我对这个问题有了更多的思考。我认为这里的核心问题是getInput()的返回值是一个临时变量。如果我改为将getInput()的结果复制到局部或全局变量中,然后将其传递给foo(),则不会有错误。我认为编译器不喜欢通过引用传递存储getInput()结果的临时变量,因为临时变量将保持有效状态多长时间?显然,它必须在getInput()返回后立即保持有效,但是此后还要持续多长时间?
答案 0 :(得分:4)
这是因为const引用可以绑定到左值和右值。将其标记为const是有意义的,即使输入是右值,也无法更改该值。如果该值不是const,则可以选择在函数内部编辑非const引用。这是没有意义的,因为输入是右值。