首页 文章

“从'std :: vector'类型的右值错误初始化'std::vector&'类型的非const引用错误

提问于
浏览
2

我从第二个参数中传入merge_sort(右)的最后一个错误的“std :: vector”类型的rvalue错误中得到“std :: vector&”类型的非const引用的无效初始化 .

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)

我一直在阅读有关rvalue如何成为临时对象的理论,并且如果它没有在初始化器中使用或者分配给变量而被销毁,但我真正想要的是一个快速而肮脏的解决方案,以便能够调用该函数参数 .

快速解决方案吗?

谢谢!

2 回答

  • 3

    将参数类型更改为 const vector<int>& (const引用),或简单地为 vector<int> (按值) .

    如果在函数内部没有对参数进行任何更改,则首选第一个选项(const引用) . 否则第二个(按值) . 如果在函数内部,您正在立即复制参数,然后在忽略原始文件时操纵副本,请按值获取参数,跳过副本,然后直接使用参数 .

  • 3

    在这个电话中:

    return merge(left_merged, merge_sort(right));
    

    第二个参数是临时的,你不能将非const引用引向临时 . 你需要

    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);.
    

相关问题