C ++无法将输入参数转换为引用

问题描述 投票:3回答:1

下面是一个产生错误的简单示例(VS 2019):

  1. E0461对非const的引用初始值必须是左值
  2. C2664'void foo(std :: string&)':无法将参数1从'std :: string'转换为'std :: string&' using namespace std; void foo(string& input) { cout << "Foo is: " << input << endl; } string getInput() { return string("abc"); } int main() { foo(getInput()); }

我不明白这个错误。 getInput()返回一个字符串。为什么不能将该字符串作为引用直接传递给foo()函数,就像任何本地或成员变量可以通过引用传递给foo()函数一样?正如错误消息所示,将字符串参数设为const会使错误消失。那为什么会这样?

更新:在考虑了我在下面发布的回复和几个链接之后,我再考虑了这个问题。我认为这里的核心问题是getInput()的返回值是一个临时变量。如果我将getInput()的结果复制到本地或全局变量中,然后将其传递给foo(),则不会出现错误。我认为编译器不“喜欢”通过引用传递存储getInput()结果的临时变量,因为临时变量保持有效多长时间?显然,它必须在getInput()返回后立即保持有效,但在此之后还要多久?

c++
1个回答
4
投票

这是因为const引用可以绑定到左值和右值。这有意义,因为标记为const,即使输入是右值,也不能更改该值。如果该值不是const,则可以选择在函数内编辑非const引用。这没有任何意义,因为输入是一个右值。

© www.soinside.com 2019 - 2024. All rights reserved.