本地参考没有参考

时间:2013-11-11 14:26:03

标签: c++ reference

据我所知,参考是一个保存对象地址的变量。 因此,我不明白这一点:

#include <iostream>
#include<string>

char* lol[]={"123","abc"};
char* fu(int i){return lol[i];};

int main ()
{
    const string& ru=fu(0);
    lol[0]="567";
    cout<<ru<<endl<<lol[0];
    return 0;
}

输出:

123
567

我在期待

567
567

因为我暗示ru持有lol [0]的地址,所以当我改变lol [0]时,ru不得不把这个改变归还给我。 谁能解释一下为什么会这样?

3 个答案:

答案 0 :(得分:3)

fu会返回char*,但您可以使用它初始化对其他类型string的引用。这可以通过创建一个临时string来解决,该临时lol[0]包含指针引用的字符串副本,并使用该临时值初始化引用。更改lol[0]不会影响该字符串。

如果您想要引用指针fu,那么ru必须返回引用,char *& fu(int i){return lol[i];} char *& ru = fu(0); 必须是对正确类型的引用:

const char *

(顺便说一句,您应该使用char*指向字符串文字,因为它们是常量。由于历史原因,过去允许转换为{{1}},但自2011年以来一直被禁止)。

答案 1 :(得分:1)

它的行为与预期不符,因为行

const string& ru=fu(0);

导致隐式类型转换,这意味着您已经创建了一个具有自己的缓冲区的新字符串。

std::string无法引用char*(类型不兼容),但编译器可以创建包含std::string值副本的新char*

答案 2 :(得分:0)

fu(0)会返回lol[0]的副本,而不是对它的引用。试试这个:

std::vector<std::string> lol = { "123", "abc" };
std::string& fu(int i){ return lol[i]; };

const std::string &ru = fu(0);
lol[0] = "567";
std::cout << ru << std::endl << lol[0];

使用std::string是必要的,因为在逻辑上不可能从c风格的字符串中创建字符串引用。它们有两种不同的类型。