【问题标题】:"Invalid initialization of non-const reference of type 'std::vector&' from an rvalue of type 'std::vector" error“从‘std::vector’类型的右值对‘std::vector&’类型的非常量引用进行无效初始化”错误
【发布时间】:2012-08-02 19:10:37
【问题描述】:

对于在第二个参数中传入 merge_sort(right) 的最后一个错误,我从“std::vector”类型的右值中得到“'std::vector&'类型的非常量引用的无效初始化”错误.

left_merged = merge_sort(left);
// right_merged = merge_sort(right);
return merge(left_merged, merge_sort(right));

这里是函数声明:

vector<int> merge_sort(vector<int>& vec)
vector<int> merge(vector<int>& left, vector<int>& right) 

我一直在阅读关于右值如何成为临时对象的理论,如果它没有在初始化程序中使用或分配给变量,则它会被销毁,但我真正想要的是能够调用的快速而肮脏的解决方案参数中的函数。

有什么快速的解决方案吗?

谢谢!

【问题讨论】:

    标签: c++


    【解决方案1】:

    将参数类型更改为const vector&lt;int&gt;&amp;(常量引用)或简单的vector&lt;int&gt;(按值)。

    如果在函数内部不对参数进行任何更改,则首选第一个选项(常量引用)。否则是第二个(按值)。如果在函数内部,您立即复制参数,然后在忽略原始参数的情况下操作副本,则按值获取参数,跳过副本,直接使用参数。

    【讨论】:

      【解决方案2】:

      在本次通话中:

      return merge(left_merged, merge_sort(right));
      

      第二个参数是一个临时的,你不能将一个非常量引用绑定到一个临时的。你需要

      vector<int> merge(vector<int>& left, const vector<int>& right);
      

      并且可能(尽管它不会影响这个特定的示例),

      vector<int> merge(const vector<int>& left, const vector<int>& right);
      

      如果您发现自己在函数中复制了参数,您可以按值获取它们。例如,如果您要复制第二个参数,则更喜欢这样:

      vector<int> merge(const vector<int>& left, vector<int> right);.
      

      【讨论】:

        猜你喜欢
        • 2015-08-03
        • 2018-04-26
        • 2012-12-18
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 2013-01-07
        相关资源
        最近更新 更多