2

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

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) 

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

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

谢谢!

4

2 回答 2

3

在本次通话中:

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);.
于 2012-08-05T15:37:09.177 回答
3

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

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

于 2012-08-05T15:37:31.417 回答