首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地引用不引用

本地引用不引用
EN

Stack Overflow用户
提问于 2013-11-11 14:26:03
回答 3查看 70关注 0票数 1

据我所知,引用是一个变量,它包含一个对象的入口。因此,我不明白这点:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
123
567

我还以为

代码语言:javascript
复制
567
567

当我对洛尔持有一个入口,所以当我改变lol时,ru不得不把那个变化还给我。有人能解释一下为什么会这样吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-11 14:31:40

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

如果您希望引用指针lol[0],那么fu必须返回一个引用,而ru必须是对正确类型的引用:

代码语言:javascript
复制
char *& fu(int i){return lol[i];}

char *& ru = fu(0);

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

票数 3
EN

Stack Overflow用户

发布于 2013-11-11 14:32:34

它的行为不像你期望的那样,因为

const string& ru=fu(0);

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 14:39:02

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

代码语言:javascript
复制
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样式字符串进行字符串引用是不可能的。它们是两种不同的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19908712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档