您好,登錄后才能下訂單哦!
本篇內容主要講解“C++為什么不要返回右值引用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++為什么不要返回右值引用”吧!
Reason(原因)
返回右值引用是在要求返回一個已經銷毀的臨時對象的引用。&&對于臨時對象來說具有吸引力。
Example(示例)
返回的右值引用在所有表達式的最后一個返回時退出了有效范圍。
auto&& x = max(0, 1); // OK, so farfoo(x); // Undefined behavior
這種用法是bug的常見原因。經常被錯誤地報告為編譯器錯誤。函數的實現者應該避免給使用者布置這樣的陷阱。
The lifetime safety profile will (when completely implemented) catch such problems.
生命周期安全規則群組會(在完全實現的情況下)捕捉這樣的問題。
Example(示例)
當引用的對象是向下(向內)傳遞給調用者時返回右值引用時會工作得很好。這種情況下可以保證臨時變量的生命周期會長于函數調用(參見F.18和F.19)。然而,當將這個引用向上(向外)傳遞給更大的調用者空間時是有問題的。對于傳遞輸入參數(通過原始引用或者完美的fowrard處理)而且需要返回值的透過型函數,使用簡單的auto類型返回類型推斷(不是auto&&)。
Assume that F
returns by value:
假設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}
std::move和std::forward也會返回&&,但是按照慣例它們只是用于臨時變量被銷毀之前,它的引用在同一表達式內傳遞的情況。
Enforcement(實施建議)
Flag any use of &&
as a return type, except in std::move
and std::forward
.
標記使用&&做返回值類型的用法,除了std::move和std::forward。
到此,相信大家對“C++為什么不要返回右值引用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。