据我所知,参考是一个保存对象地址的变量。 因此,我不明白这一点:
#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不得不把这个改变归还给我。 谁能解释一下为什么会这样?
答案 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风格的字符串中创建字符串引用。它们有两种不同的类型。