打印

函数返回值问题

[复制链接]
1167|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2013-6-28 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下一段代码:
class A;

A func()
{
    A a;
    return a;
}

int main()
{
    A *a = &func();         // s1
    A &a = func();          // s2
    return 0;
}

一、
    在我之前的理解中,函数func返回值,是在调用处的作用域生成的一个临时值,所以对其取地址没错(s1)。
s2同理。
    但是昨天,又遇到另外个人,说这个写法不对。
    测试之后发现,VS2010无问题,codeBlocks编译不过,说指针指向了临时变量。codeBlocks应该是GCC的。

二、
    但是如果用容器,诸如vector之类的,就又不会报错。
    我之前的理解中,我一直觉得容器返回的对象,应该就是func中的形式。

相关帖子

沙发
无冕之王| | 2013-6-28 23:33 | 只看该作者
func返回值是右值
不能对右值进行取地址操作,不能对右值进行引用

vector中存放的是值,容器中取元素返回的都是引用,而不是值

使用特权

评论回复
板凳
yybj| | 2013-6-28 23:47 | 只看该作者
不要去引用局部对象的地址,结果导致未定义

使用特权

评论回复
地板
秋天落叶| | 2013-6-28 23:55 | 只看该作者
LZ函数中返回的也不是临时对象而是局部对象,假如是return A();这样子就会返回一个临时对象,也许编译器会对临时对象优化,大多数编译器都会做这个优化的,effective C++中的条款。例如A aa = func();这样子函数的返回值就不会有构造和析构成本了,而是直接在aa对象空间中进行初始化操作。

使用特权

评论回复
5
sinadz| | 2013-6-29 12:42 | 只看该作者
yybj 发表于 2013-6-28 23:47
不要去引用局部对象的地址,结果导致未定义

应该就是这个问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝