代码之家  ›  专栏  ›  技术社区  ›  PentiumPro200

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

c++
  •  1
  • PentiumPro200  · 技术社区  · 7 年前

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

    1. e0461引用非常量的初始值必须是左值
    2. 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()返回后立即保持有效,但之后还要多久?

    1 回复  |  直到 7 年前
        1
  •  4
  •   cplusplusrat    7 年前

    这是因为常量引用可以绑定到左值和右值。这就像标记为const一样有意义,即使输入是rvalue,也无法更改该值。如果该值不是const,则可以选择在函数内部编辑非const引用。这没有意义,因为输入是一个rvalue。