日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用

發(fā)布時(shí)間:2025/3/21 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

template < typename T> void f (T &p)
函數(shù)參數(shù)p是一個(gè)模板類型參數(shù)T的引用, 編譯器會(huì)應(yīng)用正常的引用綁定規(guī)則; const 是底層的, 不是頂層的

1.1 從左值引用函數(shù)參數(shù)推斷類型

函數(shù)參數(shù)的類型

  • 一個(gè)普通( 左值) 引用時(shí)( 形如 T & )

綁定規(guī)則:傳遞一個(gè)左值( 一個(gè)變量或一個(gè)返回引用類型的表達(dá)式)。實(shí)參可以是 const 類型, 也可以不是。

如果實(shí)參是 const 的, 則 T 將被推斷為 const 類型: template <typename T> void f1 ( T& ) ; / / 實(shí)參必須是一個(gè)左值/ / 對(duì) fl 的調(diào)用使用實(shí)參所引用的類型作為模板參數(shù)類型 fl (i)/ / i 是一個(gè)int; 模板參數(shù)類型 T 是 int fl (ci) ; // ci 是一個(gè) const int; 模板參數(shù) T 是 const int fl (5 ); / / 錯(cuò)誤: 傳遞給一個(gè)&參數(shù)的實(shí)參必須是一個(gè)左值
  • const T&
    綁定規(guī)則:可以傳遞給它任何類型的實(shí)參 個(gè)對(duì)象( const 或非 const)、 一個(gè)臨時(shí)對(duì)象或是一個(gè)字面常量值。

  • 函數(shù)參數(shù)本身是 const 時(shí),T 的類型推斷的結(jié)果不會(huì)是一個(gè)const類型。 const已經(jīng)是函數(shù)參數(shù)類型的一部分; 因此, 它不會(huì)也是模板參數(shù)類型的一部分:

template <typename T> void f2 (const T & ) ; / / 可以接受一個(gè)右值 // f2 中的參教是 const &; 實(shí)參中的 const 是無關(guān)的 // 在每個(gè)調(diào)用中, f2 的函數(shù)參數(shù)都被推斷為 const int & f2 (i); / / i是一個(gè) int; 模板參數(shù) T 是 int f2 (ci) ; // ci 是一個(gè) const int , 但模板參數(shù) T 是 int f2 (5 ) ; // 一個(gè) const &參數(shù)可以綁定到一個(gè)右值; T 是 int

1.2 從右值引用函數(shù)參數(shù)推斷類型

當(dāng)一個(gè)函數(shù)參數(shù)是一個(gè)右值引用(形如 T &&)

綁定規(guī)則:傳遞給它一個(gè)右值。 類型推斷過程類似普通左值引用函數(shù)參數(shù)的推斷過程。 推斷出的 T 的類型是該右值實(shí)參的類型:

template <typename T> void f3 (T &&) ; f3 (42) ; // 實(shí)參是一個(gè) int 類型的右值; 模板參數(shù) T 是 int

1.3 引用折疊和右值引用參數(shù)

假定i是一個(gè) int 對(duì)象, 我們可能認(rèn)為像 f3(i) 這樣的調(diào)用是不合法的。 畢竟,i是一個(gè)左值, 而通常我們不能將一個(gè)右值引用綁定到一個(gè)左值上。 但 C++語言在正常綁定規(guī)則之外定義了兩個(gè)例外規(guī)則, 允許這種綁定。

1.3.1規(guī)則1

影響右值引用參數(shù)的推斷如何進(jìn)行。 當(dāng)我們將一個(gè)左值( 如i) 傳遞給函數(shù)的右值引用參數(shù), 且此右值引用指向模板類型參數(shù)( 如 T &&) 時(shí), 編譯器推斷模板類型參數(shù)為實(shí)參的左值引用類型。 因此, 當(dāng)我們調(diào)用 f3(i)時(shí), 編譯器推斷 T 的類型為int&,而非int。
T 被推斷為 int &看起來好像意味著 f3 的函數(shù)參數(shù)應(yīng)該是一個(gè)類型int &的右值引用。

1.3.2 規(guī)則2

如果我們間接創(chuàng)建一個(gè)引用的引用, 則這些引用形成了‘‘ 折疊”。 在所有情況下( 除了一個(gè)例外), 引用會(huì)折疊成一個(gè)普通的左值引用類型。 在新標(biāo)準(zhǔn)中, 折疊規(guī)則擴(kuò)展到右值引用。 只在一種特殊情況下引用會(huì)折疊成右值引用: 右值引用的右值引用。 即, 對(duì)于一個(gè)給定類型 X:

  • X & &、 X & & &和 X & & &都折疊成類型 X &
  • 類型 X & & & &折疊成 X & &
f3(i); //實(shí)參是一個(gè)左值; 模板參數(shù) T 是int & f3(ci); //實(shí)參是一個(gè)左值; 模板參數(shù) T 是一個(gè) const int &

當(dāng)一個(gè)模板參數(shù) T 被推斷為引用類型時(shí), 折疊規(guī)則告訴我們函數(shù)參數(shù) T & &折疊為一個(gè)左值
引用類型。 例如, f3 (i) 的實(shí)例化結(jié)果可能像下面這樣:

//無效代碼. 只是用于演示目的 void f3<int &> (int & & & ); // 當(dāng) T 是 int &時(shí), 函數(shù)參數(shù)為 int &

f3 的函數(shù)參數(shù)是 T&&且 T是int&, 因此T&&是int&&&, 會(huì)折疊成int&。 因此, 即使f3 的函數(shù)參數(shù)形式是一個(gè)右值引用(即T&&), 此調(diào)用也會(huì)用一個(gè)左值引用類型(即int&) 實(shí)例化 f3:

void f3<int&> (int & ); // 當(dāng) T 是 int &時(shí), 函數(shù)參數(shù)折疊為 int &

這兩個(gè)規(guī)則導(dǎo)致了兩個(gè)重要結(jié)果:
? 如果一個(gè)函數(shù)參數(shù)是一個(gè)指向模板類型參數(shù)的右值引用( 如T&&), 則它可以被綁定到一個(gè)左值;
? 如果實(shí)參是一個(gè)左值, 則推斷出的模板實(shí)參類型將是一個(gè)左值引用, 且函數(shù)參數(shù)將被實(shí)例化為一個(gè)( 普通) 左值引用參數(shù)(T &)

另外值得注意的是, 這兩個(gè)規(guī)則暗示, 我們可以將任意類型的實(shí)參傳遞給 T&&類型的函數(shù)參數(shù)。 對(duì)于這種類型的參數(shù), ( 顯然) 可以傳遞給它右值, 而如我們剛剛看到的, 也可以傳遞給它左值

總結(jié)

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。