这就是我所相信的:
当一个函数返回它时,创建一个对象的新临时副本,这个临时对象在语句的时间内保留在内存中。
当函数返回引用时,对象本身返回。这意味着该对象不应该是本地的。
所以当我这样做时:
MyStruct & ReferenceReturn(MyStruct cl)
{
return cl;
}
在main()中我做
MyStruct d("notmyname"),g("myname");
d = ReferenceReturn(g);
cout << d.name;
cout << ReferenceReturn(g).name;
它在两者中打印垃圾。
返回什么? :引用g的本地副本,即cl,一旦函数完成就会被销毁,或者对语句结束后被销毁的临时对象的引用。但是既然如果真的会被创造出来,它就会以正确的方式克服d。所以我相信它是传递值的本地复制的参考。
但是,只要我在结构中创建了析构函数,它就会完美地运行,具有以下代码和特定输出。
~MyStruct()
{
cout << name << " is destroying";
}
输出:
myname is destroying
myname
myname
myname is destroying
....
此输出显示每个调用只创建一个对象。 (有两个电话)
但是为什么没有析构函数就无法工作?
由于
答案 0 :(得分:2)
MyStruct & ReferenceReturn(MyStruct cl)
{
return cl;
}
创建temporary object
,将其分配给cl
,将reference
返回给对象,销毁对象。所以,它是dangling reference
。编译器可以使用copy-elision
并且不复制对象,但不能......使用lile
MyStruct & ReferenceReturn(MyStruct& cl)
{
return cl;
}
答案 1 :(得分:1)
MyStruct & ReferenceReturn(MyStruct cl) {
return cl;
}
这种情况的结果是否未定义?
该函数表现出未定义的行为,是的。问题是cl
是函数中的本地对象,并且您将返回对它的引用。这是未定义的行为。调用者将创建一个g
的副本以传递给ReferenceReturn
,该副本将在ReferenceReturn
之后被return
函数销毁,可能在调用者到达之前使用参考。