#include "iostream"
#include "vector"
using namespace std;
const vector<int>& Getv()
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
//Now when I write in main:
vector<int>v = Getv();//Throws exception
//and the below rows has no effect
vector<int>v;
v=Getv()//w does not change
请问有什么问题?答案 0 :(得分:9)
您正在返回对局部变量的引用。退出该功能时,它会被破坏。
您需要返回一份副本:
vector<int> Getv()
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
或者你可以让w
静态:
const vector<int>& Getv()
{
static vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
此外,您应该在包含中使用<>
,因为它们是标准库的一部分。
答案 1 :(得分:1)
似乎你混淆了return参数和输入参数。 通过常量引用传递参数是安全的:
void fun(const vector<int>& arg1)
{
//something
}
在该示例中,您只传递引用,因此不会调用复制构造函数。
但是从函数返回引用值(const或not const)是危险的。 见上面布鲁斯的回答。 您还可以延长参考生命周期:
const vector<int>& Getv()
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
const vector<int>& v = Getv(); //now all ok
但我不这样推荐。它可能是未来错误的来源。 最好的方法是返回向量的值。
vector<int> Getv()
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
vector<int>v = Getv();
由于只有1个return语句,因此您可以考虑RVO,也不会调用复制构造函数。它快速而安全。