我愛學習網-上傳
當前位置: 主頁 > 文庫 > C++ >

c++ 引用折疊

時間:2020-11-09 20:12來源:我愛學習網 作者:apple 點擊: 579 次

引用折疊

在現代 C++ 中一共有兩種引用類型,左值引用與右值引用,因此,在類型組合與推導的時候它們可能會出現四種組合。但是 C++ 不允許出現引用的引用,因此,需要一種機制來消除多重引用,這個機制就是引用折疊,引用折疊規則如下:

補充幾點:

  1. 引用折疊是針對通用引用的
  2. 當左值作為參數傳入的時候模板參數 T 推導為左值引用類型 T&
  3. 當右值作為參數傳入的時候模板參數 T 推導為值類型 T
  4. 然后再應用引用折疊規則,推導出具體的參數類型

引用折疊使用場景

引用折疊發生的場景不多,主要有下面四種情形:

  1. T&& 模板類型推導
  2. auto&& 變量類型推導,包括 Lambda 形參
  3. typedef / using T&& 別名聲明
  4. decltype(T)

代碼示例 :

#include 

class X {};

// lvalues are encoded as lvalue reference type
// rvalues are encoded as non-reference value type
// T's type plus '&&' collapse to param's type
template  void func(T &?m) {
  if constexpr (std::is_lvalue_reference_v) {
    std::cout << "T is lvalue reference\n";
    // T deduced to 'T&'
    // param's type is 'T& &&' collapse to 'T&'
  } else {
    std::cout << "T is non-reference\n";
    // T deduced to 'T'
    // param's type is 'T &&' collapse to 'T&&'
  }
}

template  class Y {
public:
  typedef T &&rvalueRef_t0;
  using rvalueRef_t1 = T &&;
  rvalueRef_t1 y_;
};

int main() {
  std::cout << std::boolalpha;
  using std::cout, std::is_same_v;

  // case 1: template instantiation (T&&)
  X x1{};
  func(x1);            // T is lvalue reference
  func(std::move(x1)); // T is non-reference

  // case 2: auto&& variable
  X x20{};
  // lvalue cause auto deduced to 'X&'
  // x21's type is 'X& &&' collapse to 'X&'
  auto &&x21 = x20;
  cout << is_same_v << '\n'; // true

  // rvalue cause auto deduced to 'X'
  // x22's type is 'X &&' collapse to 'X&&'
  auto &&x22 = std::move(x20);
  cout << is_same_v << '\n'; // true

  // case 3: typedef and alias declarations
  cout << is_same_v::rvalueRef_t0> << '\n';   // true
  cout << is_same_v::rvalueRef_t1> << '\n';   // true
  cout << is_same_v::rvalueRef_t0> << '\n'; // true
  cout << is_same_v::rvalueRef_t1> << '\n'; // true

  // case 4: decltype
  cout << is_same_v::y_)> << '\n'; // true

  return 0;
}

再談 std::forward

圖解 std::forward 與引用折疊的工作過程:

std::forward 對于左值,返回左值引用,對于右值,返回右值引用,保留類型修飾符

總結

  1. 理解引用折疊規則
  2. 了解引用折疊發生的場景
  3. 理解完美轉發的本質,以及引用折疊規則的應用
------分隔線----------------------------
    ?分享到??
看看啦
主站蜘蛛池模板: 免费看一区二区三区四区 | 一区二区三区四区在线视频| 在线观看日本亚洲一区| 一区二区三区在线免费| 日韩色视频一区二区三区亚洲| 国产在线精品一区二区三区不卡| 日本v片免费一区二区三区| 精品成人乱色一区二区| 无码人妻少妇色欲AV一区二区| 精品国产一区二区三区2021| 加勒比精品久久一区二区三区| 国产情侣一区二区| 亚洲av成人一区二区三区| 亚洲成AV人片一区二区密柚| 波多野结衣中文一区| 一区二区不卡在线| 无码人妻精品一区二区三区在线| 中文字幕一区二区免费| 中文字幕在线观看一区二区三区| 波霸影院一区二区| 无码AV动漫精品一区二区免费| 精品中文字幕一区二区三区四区| 性色av无码免费一区二区三区| 男人的天堂av亚洲一区2区| 亚洲综合色一区二区三区小说| 日韩精品无码一区二区三区| 中文字幕一区二区三区5566| 亚洲视频一区二区三区四区| 国产一区二区三区韩国女主播| 国产精品夜色一区二区三区 | 国产亚洲3p无码一区二区| 久久亚洲色一区二区三区| 久久久久国产一区二区三区| 国产熟女一区二区三区四区五区| 寂寞一区在线观看| 日日摸夜夜添一区| 国产精品一区二区在线观看| 亚洲男人的天堂一区二区| 好看的电影网站亚洲一区| 国产高清一区二区三区| 日本精品视频一区二区三区|