溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++為什么不要返回右值引用

發(fā)布時(shí)間:2021-11-24 11:38:09 來源:億速云 閱讀:525 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++為什么不要返回右值引用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++為什么不要返回右值引用”吧!

Reason(原因)

返回右值引用是在要求返回一個(gè)已經(jīng)銷毀的臨時(shí)對(duì)象的引用。&&對(duì)于臨時(shí)對(duì)象來說具有吸引力。

Example(示例)

返回的右值引用在所有表達(dá)式的最后一個(gè)返回時(shí)退出了有效范圍。

auto&& x = max(0, 1);   // OK, so farfoo(x);                 // Undefined behavior

這種用法是bug的常見原因。經(jīng)常被錯(cuò)誤地報(bào)告為編譯器錯(cuò)誤。函數(shù)的實(shí)現(xiàn)者應(yīng)該避免給使用者布置這樣的陷阱。

The lifetime safety profile will (when completely implemented) catch such problems.

生命周期安全規(guī)則群組會(huì)(在完全實(shí)現(xiàn)的情況下)捕捉這樣的問題。

Example(示例)

當(dāng)引用的對(duì)象是向下(向內(nèi))傳遞給調(diào)用者時(shí)返回右值引用時(shí)會(huì)工作得很好。這種情況下可以保證臨時(shí)變量的生命周期會(huì)長于函數(shù)調(diào)用(參見F.18和F.19)。然而,當(dāng)將這個(gè)引用向上(向外)傳遞給更大的調(diào)用者空間時(shí)是有問題的。對(duì)于傳遞輸入?yún)?shù)(通過原始引用或者完美的fowrard處理)而且需要返回值的透過型函數(shù),使用簡(jiǎn)單的auto類型返回類型推斷(不是auto&&)。

Assume that F returns by value:

假設(shè)F是通過值返回的:

template<class F>auto&& wrapper(F f){    log_call(typeid(f)); // or whatever instrumentation    return f();          // BAD: returns a reference to a temporary}

Better(較好):

template<class F>auto wrapper(F f){    log_call(typeid(f)); // or whatever instrumentation    return f();          // OK}
Exception(例外)

std::move和std::forward也會(huì)返回&&,但是按照慣例它們只是用于臨時(shí)變量被銷毀之前,它的引用在同一表達(dá)式內(nèi)傳遞的情況。

Enforcement(實(shí)施建議)

Flag any use of && as a return type, except in std::move and std::forward.

標(biāo)記使用&&做返回值類型的用法,除了std::move和std::forward。

到此,相信大家對(duì)“C++為什么不要返回右值引用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI