据我所知,引用是一个变量,它包含一个对象的入口。因此,我不明白这点:
#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当我对洛尔持有一个入口,所以当我改变lol时,ru不得不把那个变化还给我。有人能解释一下为什么会这样吗?
发布于 2013-11-11 14:31:40
fu返回char*,但是您可以使用它初始化对另一种类型string的引用。这是通过创建一个临时string (包含指针引用的字符串副本)并使用该临时引用初始化引用来解决的。更改lol[0]不会影响该字符串。
如果您希望引用指针lol[0],那么fu必须返回一个引用,而ru必须是对正确类型的引用:
char *& fu(int i){return lol[i];}
char *& ru = fu(0);(顺便说一句,您应该使用const char *来指向字符串文本,因为它们是常量。过去,出于历史原因,向char*的转换是允许的,但自2011年以来一直被禁止)。
发布于 2013-11-11 14:32:34
它的行为不像你期望的那样,因为
const string& ru=fu(0);
导致隐式类型转换,这意味着您已经使用自己的缓冲区创建了一个新字符串。
std::string不能引用char* (类型不兼容),但是编译器可以创建包含char*值副本的新std::string。
发布于 2013-11-11 14:39:02
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样式字符串进行字符串引用是不可能的。它们是两种不同的类型。
https://stackoverflow.com/questions/19908712
复制相似问题