【问题标题】:Correct way to use reference lvalues使用参考左值的正确方法
【发布时间】:2020-01-16 09:08:57
【问题描述】:

我的代码如下:

void parentheses (int n, string& str, int left, int right){

    ... irrelevant... 

}
void solve(int n){
    parentheses(n,"",0,0);
}

但是,这会给我一个错误,告诉我cannot bind non-const lvalue reference of type std::__cxx11::string& ... to an rvalue of type ‘std::__cxx11::string。在这种情况下,如果我仍然想将字符串作为参考传递,我应该如何修改我的函数?我不想让它们成为const,因为我想要修改原始字符串的函数,我希望它们成为&,正是因为我想编辑它们的值。

【问题讨论】:

    标签: c++ reference lvalue ampersand


    【解决方案1】:

    函数 括号 需要 std::string 参数中的左值,即命名变量。但是,您在此调用中提供了一个右值(临时):

    括号(n,"",0,0);

    创建一个空字符串对象并将其传递给括号。您可以通过像这样更改括号的定义来避免这个问题:

    void parentheses (int n, const string& str, int left, int right)
    

    这里 str 将绑定到一个右值/临时值,但您将无法在函数中更改它的值。但是,如果要更改 str 的值,则必须定义一个字符串变量并将其传递给函数。

    例子:

    void solve(int n){
        std::string str;
        parentheses(n,str,0,0);
    }
    

    注意:不需要将str分配给“”,因为字符串默认为空。

    【讨论】:

      【解决方案2】:

      您的 parentheses() 函数采用 非 const 引用std::string 对象,因此它期望在引用的另一侧有一个实际的 std::string 对象 - 一个左值(可以分配给)。

      但是您的 solve() 函数没有传递 std::string 对象,而是传递了字符串文字。所以编译器创建了一个 temporary std::string 对象 - 一个右值 - 然后无法绑定到引用,因为临时对象不能绑定到 non-const 引用,仅对 const 引用。这就是错误消息告诉您的内容:

      无法将 std::__cxx11::string& 类型的 非 const 左值引用 ...绑定到 'std::__cxx11::stringrvalue /p>

      solve() 需要显式创建一个实际的std::string 对象以传递给parentheses()

      void solve(int n){
          std::string s = "";
          parentheses(n,s,0,0);
      }
      

      【讨论】:

        【解决方案3】:

        如果您想更改作为参数(左值和右值)传递的任何字符串的字符串值,只需使用预期内容初始化一个变量并将其传递给您的函数。

        但是,如果您想将左值字符串与右值字符串区别对待,只需重载原始函数即可。即:

        void parentheses (int n, string& str, int left, int right){
            ... irrelevant... // change strings values as desired
        }
        
        void parentheses (int n, string&& str, int left, int right){
            ... irrelevant... // string as rvalue
        }
        

        【讨论】:

          【解决方案4】:

          我不太确定通过引用传递 "" 的目的是什么,因为在那里放置的任何值都会丢失。

          无论如何,要回答您的问题,请创建一个变量并将其传递:

          void solve(int n){
              std::string tmp = "";
              parentheses(n,tmp,0,0);
          }
          

          如果您不关心tmp 中存储的值,您可以忽略它。但是你需要一些类型的变量在那里,即使你不关心最终会被例程放在那里的东西。

          【讨论】:

            【解决方案5】:

            函数需要内存来改变,你没有指定哪个。 声明一个字符串来保存你想要传递的内容以及输出到哪里。

            string s = "";
            

            并将其传递给函数

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-10-05
              • 1970-01-01
              • 2015-05-04
              • 2020-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-10
              相关资源
              最近更新 更多