1

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

#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 必须将更改返回给我。谁能解释我为什么会这样?

4

3 回答 3

3

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

如果您想要对指针的引用lol[0],则fu必须返回一个引用,并且ru必须是对正确类型的引用:

char *& fu(int i){return lol[i];}

char *& ru = fu(0);

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

于 2013-11-11T14:31:40.417 回答
1

它的行为不像你预期的那样,因为这条线

const string& ru=fu(0);

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

Astd::string不能引用 a char*(类型不兼容),但编译器可以创建一个包含' 值std::string的副本的新的。char*

于 2013-11-11T14:32:34.593 回答
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 样式字符串中进行字符串引用在逻辑上是不可能的。它们是两种不同的类型。

于 2013-11-11T14:39:02.130 回答