下面是一个产生错误的简单示例(vs 2019):
-
e0461引用非常量的初始值必须是左值
-
STD:STD::String和Apple:不能将参数1从“STD::字符串”转换为“STD::Strand & Apple”。
使用名称空间std;
void foo(string& input) {
cout << "Foo is: " << input << endl;
}
string getInput() {
return string("abc");
}
int main()
{
foo(getInput());
}
我不明白这个错误。getinput()返回字符串。为什么字符串不能直接作为引用传递给foo()函数,就像任何本地或成员变量都可以通过引用传递给foo()函数一样?如错误消息所示,将字符串参数设为常量将使错误消失。为什么会这样?
更新:
在考虑了回答和我在下面发布的几个链接之后,我又考虑了这个问题。我认为这里的核心问题是getinput()的返回值是一个临时变量。如果我将getinput()的结果复制到本地或全局变量中,然后将其传递给foo(),则不会出现错误。我认为编译器不喜欢通过引用传递存储getinput()结果的临时变量,因为临时变量将保持有效多长时间?显然,它必须在getinput()返回后立即保持有效,但之后还要多久?