2015-07-04 4 views
2

Хорошо, так что я пытаюсь сделать, это передать ссылку на функцию, а затем вернуть эту же ссылку без копирования. Я не хочу использовать перемещение, потому что это может «пустить» содержимое исходной переменной. Это то, что я хочу в псевдокодеКак вернуть ссылку на ссылку, переданную в аргументе функции?

a;  
b = func(a);  
change(b); // a changes as well 

Я понимаю, что вы можете сделать это с помощью указателей (авто * Ь = & а), , но я хочу, чтобы увидеть, если это может быть сделано с помощью функции. Это то, что я пробовал:

#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 

Я понимаю, что мой вектор становится скопирована в какой-то момент (либо в качестве аргументов и/или return), и я не хочу этого.

+0

'change (b); // изменяет также. Это, вероятно, не очень хорошая идея. –

+0

_ @ Michael_ Как это составляет *** минимальный *** образец? Удалите все ненужные коды, пожалуйста! –

ответ

5

Использовать vector<int> &vec3 = returnRef2(vec1); вместо vector<int> vec3 = returnRef2(vec1);.

+0

Спасибо! (минимальный лимит) – Michael

Смежные вопросы