C 11 模板引數推導(Template Argument Deduction)是如何工作的?

時間 2021-06-01 03:55:52

1樓:electrlife

關於模版推導,借題主地盤,請教下如下情況如何理解?

template

class MyVector

private:

T aa;

};int main (int argc, const char *argv)

這裡本意是請問 push_back 的const 在推導過程是不是會重複const const std::string ?入參推導的結果是什麼?如果不重複推導過程如何?

2樓:

effective modern c++裡邊說的東西有瑕疵,Scott 錯誤地把指標也當成一種特殊規則了,標準上白紙黑字寫的只考慮引用和一般型別,其中引用又要考慮所謂「全引用」(引用摺疊)的問題,總結一下就是三類問題。

template void f(P);

f(A);

注意 T P 可能很不一樣

注意 T 的型別可能很奇怪,會影響到你在函式模版內部使用它

注意 A' 是修飾過的 A,P' 是修飾過的P

首先去掉 P 的 top cv-qualifiers 得到 P'

第一類:P' 不是引用型別

去掉 A 的 top cv-qualifiers; A 如果是函式或者陣列,decay 為 pointer

P' = A'

例如 :

P =const T *

P' = T *

A = const int const *

A' = const int *

P' = T * = A' = const int *,即 T = const int

第二類:P' 是引用型別 (P' = P'' & 或者 P' = P'' &&)

P'' = A (P'' 可以多 cv-qualifiers)

例如:P = const T &

P'' = const T

A = const int *

P'' = const T = A = const int *,即 T = const int *

注意原有的 P = const const int * &,連續的 const 應該被視為乙個,原則上來說可以寫 const const int a = 1; clang正常工作,gcc報錯(F**k gcc)

第三類: P = T &&

當A為左值時,A' = A &

T = A'

例如:A = const int *(lvalue)

T = const int * &

再說一下Scott說的incomplete class deduction

核心就是利用模版推導發生在編譯時,利用出錯資訊確定variable_whos_type_unknown的型別

template TD;

TD td;

------吐槽分割線-------

最後還要 f**k initializer_list,C++11最失敗的改進不帶之一

3樓:spiritsaway

可以參考 @bitdewy 自己翻譯的effective morden c++的前五章,blog位址見此:[譯] Item 1: Understand template type deduction

C 可變引數的模板展開?

因為這不是合理的展開場所。在C 17之前,我們都是這麼幹的。void std initializer list 不過這和C 其他很多tricky的寫法一樣,都是歷史了。無聊智力遊戲。 1.template void print args T t template void print args T ...

C 模板右值引用推導的問題?

情況是這樣的 int i 10 foo i 首先進行 name lookup 找到了 2 個 foo,然後進行模板引數的歸約.第 1 個是 foo T with T int 第 2 個是 foo const T with T int 之後進行過載決議,優先順序從 完美匹配 型別提公升 型別轉換 依次...

c 11中std unique ptr需要明確知道型別的析構函式,而shared ptr不需要?

土地測量員 詳細講一下std unique ptr的部分吧。std unique ptr需要明確知道型別的析構函式 unique ptr型別是 template class T,class Deleter std default delete class unique ptr private T p...