[英]Why is the const&& overload of as_const deleted?
在關於C ++ 17進展的博客上,我閱讀了以下內容:
P0007
提出了一個輔助函數模板as_const
,as_const
需要一個引用並將其作為對const
的引用返回。template <typename T> std::add_const_t<T>& as_const(T& t) { return t } template <typename T> void as_const(T const&&) = delete;
為什么刪除const&&
重載?
考慮如果你沒有那個重載會發生什么,並嘗試傳入一個const
rvalue:
template <typename T> const T &as_const(T &t) { return t; }
struct S { };
const S f() { return S{}; }
int main() {
// auto & ref = as_const(S()); // correctly detected as invalid already
auto & ref = as_const(f()); // accepted
}
這將被接受,因為T
將被推導為const S
,並且臨時數可以綁定到const S &
。 結果是你不小心得到一個臨時的左值引用,它將在ref
初始化后立即銷毀。 幾乎所有采用左值(無論是變量還是函數參數)的用戶都不希望傳遞臨時值; 默默地接受臨時工作意味着你很容易默默地獲得懸掛的參考資料。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.