亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用前向的優點

使用前向的優點

C++ C
幕布斯7119047 2019-06-04 16:32:22
使用前向的優點在完美的轉發中,std::forward用于轉換命名的rvalue引用。t1和t2到未命名的rvalue引用。這樣做的目的是什么?這將如何影響被調用的函數?inner如果我們離開t1 & t2作為落伍?template <typename T1, typename T2>void outer(T1&& t1, T2&& t2) {     inner(std::forward<T1>(t1), std::forward<T2>(t2));}
查看完整描述

3 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

在完美轉發中,std:Forward用于將命名的rvalue引用T1和T2轉換為未命名的rvalue引用。這樣做的目的是什么?如果我們把t1和t2作為lvalue,這會對調用的函數內部產生什么影響?

template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) {
    inner(std::forward<T1>(t1), std::forward<T2>(t2));}

如果在表達式中使用命名的rvalue引用,則它實際上是lvalue(因為您按名稱引用對象)??紤]以下示例:

void inner(int &,  int &);  // #1void inner(int &&, int &&); // #2

現在,如果我們打電話outer像這樣

outer(17,29);

我們希望將17和29轉發到#2,因為17和29是整數值,因此rvalue。但既然t1t2在表達中inner(t1,t2);如果是lvalue,您將調用#1而不是#2。這就是我們需要將引用轉換回未命名引用的原因。std::forward..所以,t1在……里面outer總是一個lvalue表達式,而forward<T1>(t1)可能是一個rvalue表達式,取決于T1..后者只是一個lvalue表達式,如果T1是一個無值引用。和T1僅在外部的第一個參數是lvalue表達式的情況下才推斷為lvalue引用。


查看完整回答
反對 回復 2019-06-04
  • 3 回答
  • 0 關注
  • 537 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號