<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## [$]一.模板實參推斷 1. 函數實參的頂層 `const` 會被忽略,而底層 `const` 會保留。 #### 例1 函數實參為 `T` 時,傳入 `const int` 的數據,則 `T=int` 。 函數實參為 `T &` 時,傳入 `const int` 的左值,則 `T=const int` 。 函數實參為 `T &&` 時,傳入 `const int` 的右值,則 `T=const int` 。 2. 模板推斷中,類型轉換是有限的: + 左值到右值的轉換。例如,傳入整型變量,編譯器會推斷為 `int` 而不是 `int &`,除非函數實參加了引用 `T &`。 + `const` 轉換:非底層 `const` 轉換成底層 `const` 。 + 數組轉換成指向數組第一個元素的指針。 + 函數轉換成函數指針。 其他的轉換不會用于模板類型的函數參數,例如算術轉換、派生類到基類的轉換、用戶定義的轉換。 3. 相同的模板實參用于多個函數參數時, **實參必須嚴格一致** 。正常的函數參數不受影響。 4. 當用戶指定顯式的實參時,正常的類型轉換便會應用于顯式實參。 #### 例2 ```c++ template <typename T> T add(const T &t1,const T &t2) { return t1+t2; } ``` 函數調用: ```c++ add(298,700);//ok long l = 298; add(l,700);//wrong:編譯器從第一個參數中推斷出T=long,從第二個參數中推斷出T=int。 add<int>(l,700);//ok:正常的類型轉換會應用于顯式實參 ``` 5. [11+]當參數被指定為右值引用時,可能會發生引用折疊,導致該參數既可以接受左值,也可以接受右值。 #### [11+]例3 函數實參為 `T &&` 時,傳入 `int` 的純右值,則 `T=int` 。 函數實參為 `T &&` 時,傳入 `int` 的左值,則 `T=int &` ,但此時發生引用折疊, `&&&` 被折疊為 `&`,最終 `T &&` 是一個左值引用 `int &`。 函數實參為 `T &&` 時,傳入將亡值 `int &&` ,則 `T=int &&` ,但此時發生引用折疊, `&&&&` 被折疊為 `&&`,最終 `T &&` 是一個右值引用 `int &&`。 ## [$]二.函數指針與實參推斷 編譯器會通過指針的類型來進行參數的推斷,如果參數無法匹配或出現二義性,則編譯器報錯。 #### 例4 ```c++ //add的定義參見例2 typedef long (*Fp)(const long &,const long &); Fp f= add; long l = 298; f(l,700);//ok ``` ## [$]三.重載與模板 1. 候選的函數模板總是可行的,因為模板實參推斷會排除任何不可行的模板。 2. 當多個函數提供了同樣好的匹配:(越特例化越優先) + 如果同樣好的函數中只有一個是非模板函數,則選擇此函數。 + 如果同樣好的函數中沒有非模板函數,而有多個函數模板,且其中一個模板比其他模板更特例化,則選擇此模板。 + 否則,此調用是二義性的。 #### 例5 假設有下面一組函數: ```c++ template <typename T> void print(const T &t); template <typename T> void print(T *p); void print(const string &s); ``` 1. 當通過以下方式調用時,匹配第一個版本。 ```c++ print(2333); ``` 2. 當通過以下方式調用時,生成兩個可行的匹配: + `void print(const string &t);` + `void print(const string &s);` 正常的模板解析過程無法區分這兩個函數。但是,根據重載函數模板的特殊規則,`const string &s` 不是模板類型,因此這里匹配第二個版本。 ```c++ string s = "2020"; print(s); ``` 3. 當通過以下方式調用時,生成兩個可行的匹配: + `void print(const string *&t);` + `void print(string *p);` 而第一個版本需要非 `const` 到 `const` 的轉換,因此這里匹配第二個版本。 ```c++ string s = "2020"; print(&s); ``` 4. 當通過以下方式調用時,生成了兩個可行的匹配: + `void print(const string *&t);` + `void print(const string *p);` 正常的模板解析過程無法區分這兩個函數。但是,根據重載函數模板的特殊規則,`const T &t` 適用于任意類型,而 `T *p` 適用于指針。也就是說,第二個版本更特例化,所以匹配到第二個版本。 ```c++ string s = "2020"; const string *ps = &s; print(ps); ``` 5. 當通過以下方式調用時,生成了三個可行的匹配: + `void print(const char (&t)[10]);` 這里參數是一個數組的引用。 + `void print(const char *p);` + `void print(const string *&s);` 第三個版本需要進行一次用戶定義的類型轉換,第二個版本需要進行數組到指針的轉換,第一個版本不需要轉換。但是數組到指針的轉換被認為是精確匹配,所以只排除第三個版本。 與上一個例子一樣,`const T &t` 適用于任意類型,而 `T *p` 適用于指針。也就是說,第二個版本更特例化,所以匹配到第二個版本。 ```c++ print("Hello"); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看