如何 return 引用函数参数中传递的引用?
How to return a reference to the reference passed in function argument?
好的,所以我要做的是传递对函数的引用,然后 return 相同的引用而不进行复制。我不想使用移动,因为它可以 "empty" 原始变量的内容。这就是我想要的伪代码
a;
b = func(a);
change(b); // a changes as well
我知道你可以用指针来做到这一点(auto * b = &a),
但我想看看是否可以用一个函数来完成。这是我试过的:
#include <vector>
#include <iostream>
using namespace std;
template<class T>
T& returnRef1(T* t){
return *t;
}
template<class T>
T& returnRef2(T& t){
return t;
}
int main(){
vector<int> vec1 = { 0, 1, 2, 3, 4 };
auto * p2v = &vec1;
vector<int> vec2 = returnRef1(p2v);
vector<int> vec3 = returnRef2(vec1);
vec2[0] = 1000;
vec3[1] = 999;
cout << "vec1[0]=" << vec1[0] << " vec1[1]=" << vec1[1] << endl;
cout << "vec2[0]=" << vec2[0] << " vec2[1]=" << vec2[1] << endl;
cout << "vec3[0]=" << vec3[0] << " vec3[1]=" << vec3[1] << endl;
cin.get();
}
打印什么
vec1[0]=0 vec1[1]=1
vec2[0]=1000 vec2[1]=1
vec3[0]=0 vec3[1]=999
我想要什么
vec1[0]=1000 vec1[1]=999
vec2[0]=1000 vec2[1]=999
vec3[0]=1000 vec3[1]=999
我知道我的向量在某些时候被复制了(在参数 and/or return 中),我不希望这样。
使用 vector<int> &vec3 = returnRef2(vec1);
代替 vector<int> vec3 = returnRef2(vec1);
。
好的,所以我要做的是传递对函数的引用,然后 return 相同的引用而不进行复制。我不想使用移动,因为它可以 "empty" 原始变量的内容。这就是我想要的伪代码
a;
b = func(a);
change(b); // a changes as well
我知道你可以用指针来做到这一点(auto * b = &a), 但我想看看是否可以用一个函数来完成。这是我试过的:
#include <vector>
#include <iostream>
using namespace std;
template<class T>
T& returnRef1(T* t){
return *t;
}
template<class T>
T& returnRef2(T& t){
return t;
}
int main(){
vector<int> vec1 = { 0, 1, 2, 3, 4 };
auto * p2v = &vec1;
vector<int> vec2 = returnRef1(p2v);
vector<int> vec3 = returnRef2(vec1);
vec2[0] = 1000;
vec3[1] = 999;
cout << "vec1[0]=" << vec1[0] << " vec1[1]=" << vec1[1] << endl;
cout << "vec2[0]=" << vec2[0] << " vec2[1]=" << vec2[1] << endl;
cout << "vec3[0]=" << vec3[0] << " vec3[1]=" << vec3[1] << endl;
cin.get();
}
打印什么
vec1[0]=0 vec1[1]=1
vec2[0]=1000 vec2[1]=1
vec3[0]=0 vec3[1]=999
我想要什么
vec1[0]=1000 vec1[1]=999
vec2[0]=1000 vec2[1]=999
vec3[0]=1000 vec3[1]=999
我知道我的向量在某些时候被复制了(在参数 and/or return 中),我不希望这样。
使用 vector<int> &vec3 = returnRef2(vec1);
代替 vector<int> vec3 = returnRef2(vec1);
。