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...