[英]Is returned object form a fuction how's return type is rvalue reference, a rvalue or a lvalue?
[英]What gets returned return type is reference of object?
這就是我所相信的:
當函數返回時,將創建該對象的新臨時副本,並且此temp對象將在調用它的語句期間保留在內存中。
當函數返回引用時,該對象本身將返回。 這意味着該對象不應是本地的。
所以當我這樣做時:
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。 因此,我認為返回的是傳遞值的localcopy的引用。
但是,一旦我在結構中使用析構函數,它就可以完美運行,並提供以下代碼和特定的輸出。
~MyStruct()
{
cout << name << " is destroying";
}
輸出:
myname is destroying
myname
myname
myname is destroying
....
此輸出顯示為每個調用僅創建一個對象。 (有兩個電話)
但是,為什么沒有析構函數就無法工作?
謝謝
MyStruct & ReferenceReturn(MyStruct cl)
{
return cl;
}
創建temporary object
,將其分配給cl
,返回對對象的reference
,銷毀對象。 因此,它dangling reference
。 編譯器可以使用copy-elision
並且不復制對象,但是不能...使用某些東西
MyStruct & ReferenceReturn(MyStruct& cl)
{
return cl;
}
MyStruct & ReferenceReturn(MyStruct cl) {
return cl;
}
在這種情況下結果不確定嗎?
該函數表現出未定義的行為,是的。 問題在於cl
是函數中的局部對象,並且您正在返回對其的引用。 這是未定義的行為。 調用者將創建g
的副本以傳遞給ReferenceReturn
,並且該副本將在return
(可能在調用者使用引用之前)被ReferenceReturn
函數銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.