"类型' std :: vector&'的非const引用的初始化无效来自类型' std :: vector"的左值错误

时间:2012-08-05 15:33:21

标签: c++

我得到“”std :: vector&'类型的非const引用的无效初始化来自第二个参数中传递merge_sort(右)的最后一个类型'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) 

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

任何快速解决方案?

谢谢!

2 个答案:

答案 0 :(得分: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);.

答案 1 :(得分:3)

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

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