久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

C++模板學(xué)習(xí)筆記:從編譯期代碼生成到C++20 Concepts

C++模板學(xué)習(xí)筆記:從編譯期代碼生成到C++20 Concepts C模板一直是我學(xué)習(xí)之路上繞不過去的一座山。寫這篇學(xué)習(xí)筆記之前我已經(jīng)在項目里被模板編譯錯誤折磨過好多次——明明照著文檔寫了編譯器就是看不懂我的代碼。后來我換了個思路去理解它模板根本不是“帶類型的函數(shù)”而是一套讓類型作為參數(shù)參與編譯的代碼生成機制。想通這一點之后之前那些報錯突然就變得有跡可循了。這篇文章可以看成我重新整理過的C模板學(xué)習(xí)筆記從函數(shù)模板和類模板的基礎(chǔ)語法開始一路講到特化、變參模板、模板元編程再到C20的Concept。適合兩類人讀一是剛開始接觸模板、想系統(tǒng)建立概念的初學(xué)者二是寫過一點模板代碼但經(jīng)常被編譯錯誤卡住、想提升排查能力的人。我會把每一部分都配合真實可運行的代碼片段順帶分享一些我在實際開發(fā)中被坑過的地方。1. 模板到底解決了什么問題從重復(fù)代碼到類型參數(shù)化1.1 一段讓我決定認(rèn)真學(xué)模板的重復(fù)代碼兩年前我在某個內(nèi)部工具項目里寫過一段“三胞胎”代碼。需求很簡單求兩個值里的較大者但調(diào)用方有時傳int有時傳double有時傳std::string。我當(dāng)時的做法是完全復(fù)制粘貼改一改參數(shù)類型和函數(shù)名像這樣int max_int(int a, int b) { return a b ? a : b; } double max_double(double a, double b) { return a b ? a : b; } std::string max_string(const std::string a, const std::string b) { return a b ? a : b; }三個函數(shù)邏輯一模一樣只是類型不同。更麻煩的是后來需求變了比較規(guī)則從“大于”改成“絕對值更大”我就要同步修改三處代碼漏改一處線上行為就會出現(xiàn)詭異的不一致。那段時間我深刻體會到一個道理重復(fù)代碼的維護(hù)成本是乘積增長的而不只是求和。真正讓我下定決心啃模板的就是這一堆不斷擴散的“三胞胎”。1.2 模板的“編譯期鴨子類型”實例化才是核心用模板改寫上面的問題代碼量立刻縮成一份template typename T T my_max(const T a, const T b) { return a b ? a : b; }關(guān)鍵在于理解上面的my_max并不是一個真正的函數(shù)它只是一份“函數(shù)藍(lán)圖”。編譯器看到my_max(1, 2)時會用int替換掉模板參數(shù)T生成一份針對int的真實函數(shù)看到my_max(1.5, 2.5)時再生成一份針對double的。這個過程叫模板實例化發(fā)生在編譯期運行期完全不感知模板的存在。我習(xí)慣用模具來類比模板是模具本身實例化出來的函數(shù)才是被沖壓出的零件。同一個模具改變原材料類型就能做出不同材質(zhì)但形狀相同的零件。這個理解幫我解決了很多疑惑——比如為什么模板類可以接受那些只支持部分操作的類型因為成員函數(shù)是按需實例化的你沒用到某個成員函數(shù)編譯器就不會去檢查它內(nèi)部的運算合不合法。1.3 模板代碼與普通代碼的三點不同在實際工程里模板代碼給人的“脾氣”和普通函數(shù)很不一樣我總結(jié)了三條最重要的差異第一運行期開銷為零。模板實例化在編譯期完成生成的是普通函數(shù)沒有虛函數(shù)那樣的間接跳轉(zhuǎn)沒有額外的運行時類型信息。作為對比如果用基類指針加虛函數(shù)實現(xiàn)類似效果運行期每一次調(diào)用都要查虛函數(shù)表。第二錯誤往往出現(xiàn)在使用處而不是定義處。模板定義本身經(jīng)常是“法外之地”比如上面my_max要求類型支持operator。你把這個模板定義放在頭文件里編譯器不會立刻報錯只有在某個使用處傳入一個不支持operator的類型時編譯器才會把長長的實例化調(diào)用鏈甩到你臉上。第三定義必須可見。普通函數(shù)可以聲明在頭文件、定義在源文件鏈接器最后把它們拼起來模板不行因為實例化需要看到完整定義。很多新手第一次寫模板習(xí)慣性地把實現(xiàn)放在.cpp里結(jié)果一鏈接變成一堆“undefined reference”這是模板學(xué)習(xí)的第一個經(jīng)典大坑。這三條差異構(gòu)成了理解后面所有內(nèi)容的基礎(chǔ)。我見過太多人糾結(jié)模板語法本身卻忽略了模板的“編譯期代碼生成”本質(zhì)導(dǎo)致遇到報錯時無從下手。2. 函數(shù)模板與類模板入門第一步的關(guān)鍵細(xì)節(jié)2.1 函數(shù)模板的參數(shù)推導(dǎo)與顯式指定函數(shù)模板最讓人舒爽的一點是大部分時候不需要你手動指定類型編譯器會自動推導(dǎo)模板參數(shù)auto v1 my_max(1, 2); // T推導(dǎo)為int auto v2 my_max(1.5, 2.5); // T推導(dǎo)為double auto v3 my_max(a, z); // T推導(dǎo)為char但推導(dǎo)并不是萬能的。我踩過的第一個坑是調(diào)用my_max(1, 2.5)時編譯器直接報錯“template argument deduction failed”。原因是模板參數(shù)T同時出現(xiàn)在const T a和const T b兩個位置編譯器遇到int和double兩種實參時無法確定T到底該選哪個。這時候有兩個選擇顯式指定模板參數(shù)讓int隱式轉(zhuǎn)換成double或者修改模板讓兩個參數(shù)接受不同類型。auto v my_maxdouble(1, 2.5); // 顯式指定T為double顯式指定模板參數(shù)的一個常見場景是函數(shù)參數(shù)和返回值類型有關(guān)聯(lián)但又不完全能從參數(shù)推導(dǎo)出來比如想要返回值類型和某個參數(shù)類型不同時。另一個容易忽略的規(guī)則形如const T的參數(shù)推導(dǎo)時T剝掉引用和頂層const。比如傳一個const int進(jìn)去T推導(dǎo)為int而不是const int。這個細(xì)節(jié)在涉及類型萃取和完美轉(zhuǎn)發(fā)時會變得非常重要建議一開始就有意識地去注意。2.2 類模板的靜態(tài)成員與友元函數(shù)三個容易混淆的點類模板的語法本身并不復(fù)雜無非是把類變成“模具”template typename T class Box { public: static int count; T value; void print() const; }; template typename T int BoxT::count 0;但有三個點我直到實際寫代碼時才真正理解第一個是靜態(tài)成員屬于每個實例。Boxint和Boxdouble各自擁有一份獨立的count因為它們本質(zhì)上是兩個不同的類。你可以在Boxint里累加計數(shù)Boxdouble::count依然是0兩者互不影響。第二個是成員函數(shù)按需實例化。如果某個類型可以構(gòu)造出Box但print()內(nèi)部調(diào)用了這個類型不支持的接口只要整個程序里沒有調(diào)用過Box該類型::print()編譯就能通過。這種“懶加載”特性在泛型約束不足的時候很危險——你可能以為所有類型都支持某個操作結(jié)果撐到運行時才炸。第三個是友元聲明用法特殊。在類模板里聲明友元函數(shù)模板要么用friend void func(T);聲明依賴模板參數(shù)的友元要么用template typename U friend void func(U);聲明一個獨立的友元模板。寫錯的情況下你會得到一堆“鏈接錯誤”或者“重復(fù)聲明”的奇怪報錯。2.3 為什么模板的聲明和定義不能分開放這個問題被問過無數(shù)次也是我最早踩的坑之一。普通函數(shù)可以這樣寫// foo.h int add(int a, int b); // foo.cpp int add(int a, int b) { return a b; }編譯時使用add的源文件只要看到聲明就生成調(diào)用代碼至于定義在哪鏈接器負(fù)責(zé)去找。模板不一樣編譯器在需要實例化template typename T T my_max(...)的時候必須看到模板的完整定義才能往里填入T并生成代碼。如果頭文件里只有聲明調(diào)用處只知道“有這么個模板”卻不知道函數(shù)體是什么編譯器就只能放棄把問題留給鏈接器于是出現(xiàn)一堆完全看不懂的undefined reference。解決方案主要有兩種。最常用的是把模板實現(xiàn)也寫在頭文件里這也是標(biāo)準(zhǔn)庫一直以來的做法另一種是在源文件里顯式實例化比如// template_impl.cpp template int my_maxint(const int, const int); template double my_maxdouble(const double, const double);這相當(dāng)于提前把指定類型的實例生成好鏈接器就能找到定義。但顯式實例化的缺點也很明顯每個需要用到的類型都得手寫一遍一旦類型多起來維護(hù)成本比重復(fù)代碼還可怕。所以絕大部分項目都會選擇第一種“頭文件內(nèi)定義”的方式。3. 模板特化與偏特化編譯器在分支路口如何做選擇3.1 全特化的寫法與適用場景模板實例化時編譯器默認(rèn)是用一個統(tǒng)一“模具”生成代碼。但某些類型可能有更好的實現(xiàn)方式這時就可以為特定類型開小灶這就是全特化。比如前面那個my_max遇到const char*這種C風(fēng)格字符串如果用默認(rèn)的operator去比較比的是指針地址而不是字符串內(nèi)容結(jié)果完全不符合直覺。這時候可以寫一個全特化版本template const char* my_maxconst char*(const char* const a, const char* const b) { return std::strcmp(a, b) 0 ? a : b; }全特化的關(guān)鍵字是template 后面跟一個完全確定類型的函數(shù)或類定義。編譯器在為const char*做實例化時會優(yōu)先找到這個特化版本而不是通用模板。我當(dāng)時的理解是通用模板是默認(rèn)工廠流程全特化是給特定訂單單獨開了一條生產(chǎn)線。不過這里必須提醒一句函數(shù)模板的全特化其實很容易被忽略尤其在存在函數(shù)重載的時候。編譯器選擇順序是先看非模板函數(shù)再看模板特化最后才看模板實例化。如果項目中同時存在一個同名同參的非模板函數(shù)和一個全特化版本非模板函數(shù)往往被優(yōu)先選中這個行為常常讓人困惑。所以我在實踐中更傾向于用函數(shù)重載而不是函數(shù)模板全特化但類模板沒有重載這回事只能特化。3.2 類模板偏特化指針、引用與const的幾種典型偏特化類模板只有全特化和偏特化沒有“重載”。偏特化是指保留部分模板參數(shù)只對某一種模式做專門處理。最常見的應(yīng)用場景是針對指針類型、引用類型、const類型做差異處理。template typename T class Wrapper { public: T data; }; // 針對指針類型的偏特化 template typename T class WrapperT* { public: T* ptr; }; // 針對const類型的偏特化 template typename T class Wrapperconst T { public: T value; // 注意這里T本身剝掉了const };偏特化的本質(zhì)是“模式匹配”。WrapperT*匹配任何指針類型Wrapperconst T匹配任何const類型。編譯器會按匹配程度選一個最合適版本比如Wrapperconst int*既可以被WrapperT*匹配Tconst int也可以被Wrapperconst T匹配Tint*但最終選擇時部分特化與參數(shù)模式的貼合程度會被比較通常T*更貼合因為外面一層是指針且內(nèi)部是const int。這里有個細(xì)節(jié)我原來常弄混偏特化只能用于類模板不能用于函數(shù)模板。函數(shù)模板想要類似效果應(yīng)該用重載。所以如果有人試圖給函數(shù)模板寫template typename T void funcT*(T*)這樣的偏特化語法編譯器會直接拒絕。3.3 特化與重載的優(yōu)先級一個讓我調(diào)試到崩潰的例子有一次我在項目里給一個工具庫寫了這樣的代碼template typename T void handle(const T value) { std::cout generic std::endl; } template void handleint(const int value) { std::cout int specialization std::endl; } void handle(const int value) { std::cout non-template overload std::endl; }調(diào)用handle(42)時我滿心以為輸出的是int specialization結(jié)果控制臺打印出來的是non-template overload。查了好半天才發(fā)現(xiàn)編譯器在選擇重載時非模板版本優(yōu)先于模板特化版本。這條規(guī)則我后來在標(biāo)準(zhǔn)條款里確認(rèn)過如果非模板函數(shù)和模板特化都能匹配非模板函數(shù)優(yōu)先。這件事給我的教訓(xùn)是不要試圖用函數(shù)模板特化去“覆蓋”重載決議它的行為既不直觀又容易讓維護(hù)者誤會。函數(shù)模板想針對特定類型做區(qū)分正確姿勢是寫一個更特化的函數(shù)重載或者用后面會講到的if constexpr/概念約束。類模板特化才是干凈利落的解決方案。4. 變參模板與折疊表達(dá)式簡化重復(fù)代碼的實用工具4.1 參數(shù)包展開的三種方式變參模板variadic templates是我學(xué)會之后覺得“真香”的特性。它允許模板接受任意數(shù)量、任意類型的參數(shù)。C11引入時主要是為了配合完美轉(zhuǎn)發(fā)實現(xiàn)工廠函數(shù)后來C17折疊表達(dá)式讓這個語法又好寫了非常多。先看最經(jīng)典的遞歸展開方式。要打印任意個參數(shù)可以這樣void print_all() { // 遞歸終止函數(shù)空參數(shù)包時結(jié)束 } template typename T, typename... Args void print_all(const T first, const Args... rest) { std::cout first ; print_all(rest...); // 每次剝掉一個參數(shù) }typename... Args聲明一個參數(shù)包Args... rest在函數(shù)參數(shù)列表中表示一組參數(shù)。遞歸展開每次取出第一個參數(shù)剩下的繼續(xù)遞歸直到參數(shù)包為空時調(diào)用無參重載。這是最直觀的展開方式邏輯清晰但每層遞歸都要生成一個新模板實例編譯代價略高。第二種方式是用初始化列表配合逗號表達(dá)式一次性展開template typename... Args void print_all_init(const Args... args) { (void)std::initializer_listint{ (std::cout args , 0)... }; }這里的(std::cout args , 0)是個逗號表達(dá)式先執(zhí)行打印再生成一個int類型的0整個表達(dá)式結(jié)果就是0于是可以放進(jìn)std::initializer_listint。...把參數(shù)包展開成一組用逗號分隔的表達(dá)式。這個寫法不需要遞歸模板實例化層級少編譯效率更好缺點是讀起來比較勸退。第三種方式是在C17里最簡單直接的——折疊表達(dá)式下面單獨說。4.2 折疊表達(dá)式C17之后的簡潔寫法折疊表達(dá)式讓變參模板的可讀性提升了一大截。它的語法看一眼就明白一半template typename... Args void print_all_fold(const Args... args) { (std::cout ... args) std::endl; }這個表達(dá)式(std::cout ... args)是左折疊等價于把args從左到右依次拼到std::cout上。對于打印這種沒有累積結(jié)果的場景更常用的是逗號折疊template typename... Args void print_all_fold2(const Args... args) { ((std::cout args ), ...); std::cout std::endl; }逗號折疊會把每個參數(shù)依次打印出來中間的逗號不是打印內(nèi)容而是折疊操作符。我當(dāng)時第一次看到(...)這個寫法有點懵但只要記住一點折疊表達(dá)式是對參數(shù)包做一次編譯期的二元歸約一元右折(args op ...)從最后一個參數(shù)開始一元左折(... op args)從第一個參數(shù)開始。折疊表達(dá)式特別適合做求和、拼接、邏輯與這類累積操作。比如template typename... Args auto sum_all(Args... args) { return (args ... 0); // 二元折疊初始值0避免空包報錯 }注意空參數(shù)包時沒有初始值的折疊表達(dá)式是非法的所以求和時最好加上一個初始值。4.3 變參模板在工廠函數(shù)與完美轉(zhuǎn)發(fā)中的應(yīng)用變參模板最常見的一個實際場景是寫工廠函數(shù)。標(biāo)準(zhǔn)庫里的std::make_shared、std::make_unique本質(zhì)就是變參模板加完美轉(zhuǎn)發(fā)。一個簡化版本可以這樣寫template typename T, typename... Args std::shared_ptrT my_make_shared(Args... args) { return std::shared_ptrT(new T(std::forwardArgs(args)...)); }這里的關(guān)鍵是Args... args和std::forwardArgs(args)...。Args不是普通的右值引用而是轉(zhuǎn)發(fā)引用也叫萬能引用它可以根據(jù)實參自動推導(dǎo)成左值引用或右值引用。std::forward的作用是保留參數(shù)原有的值類別如果調(diào)用方傳進(jìn)來的是一個左值就按左值轉(zhuǎn)發(fā)如果是右值就按右值轉(zhuǎn)發(fā)。這樣一來構(gòu)造函數(shù)里不會因為參數(shù)中途丟失“移動語義”或“拷貝語義”而引發(fā)不必要的拷貝。我第一次接觸這個寫法時總是想不通為什么要這么繞。后來我明白了在模板函數(shù)內(nèi)部具名的參數(shù)都是左值哪怕實參原本是右值。如果不加std::forward原本可以移動構(gòu)造的對象被迫拷貝構(gòu)造性能白白損失。這個細(xì)節(jié)在寫高性能容器、事件分發(fā)系統(tǒng)時非常關(guān)鍵。5. 模板元編程與類型萃取把運行期的判斷搬到編譯期5.1std::is_same和std::enable_if的搭配模板真正強大的地方不只在于生成代碼還在于可以在編譯期“根據(jù)類型做判斷”。C11標(biāo)準(zhǔn)庫提供了大量類型萃取工具比如std::is_sameT, U專門用來判斷兩個類型是否一致。但如果你直接這么寫多半會掉坑里template typename T void process(const T value) { if (std::is_sameT, int::value) { // 假設(shè)這里調(diào)用了value.someIntMethod() } else { // 假設(shè)這里調(diào)用了value.someStringMethod() } }問題在于模板實例化時if的兩個分支都會被編譯無論T是int還是std::string兩個分支里那些“不存在的方法”都會導(dǎo)致編譯失敗。運行期判斷無法阻止編譯期錯誤。正確做法是讓不滿足條件的分支從編譯過程里直接消失。std::enable_if就是為此設(shè)計的template typename T typename std::enable_ifstd::is_sameT, int::value, void::type process(const T value) { std::cout 處理int std::endl; } template typename T typename std::enable_if!std::is_sameT, int::value, void::type process(const T value) { std::cout 處理其他類型 std::endl; }std::enable_if條件, 類型::type只在條件為真時才存在條件為假時整個函數(shù)聲明就是非法的編譯器直接丟棄這個重載。這相當(dāng)于在編譯期做了一次“替換失敗不是錯誤”SFINAE的篩選。不過說實話這種寫法讀起來很拗口。C17之后有了if constexpr相同場景簡單得多template typename T void process(const T value) { if constexpr (std::is_sameT, int::value) { // 只在T是int時編譯 } else { // 只在T不是int時編譯 } }if constexpr的真正意思是“在編譯期選擇一個分支另一個分支不實例化”。這比enable_if直觀太多所以我的經(jīng)驗是新項目盡量用if constexprenable_if更多用于需要參與重載決議的場合。5.2 一個編譯期階乘模板理解遞歸實例化的邊界模板元編程最經(jīng)典的教學(xué)示例是在編譯期計算階乘。用模板遞歸來實現(xiàn)template int N struct Factorial { static const int value N * FactorialN - 1::value; }; // 偏特化/特化提供遞歸終止條件 template struct Factorial0 { static const int value 1; }; // 用法 static_assert(Factorial5::value 120, 5! should be 120);這段代碼展示了一個元編程的核心模式用模板參數(shù)驅(qū)動遞歸用特化提供終止條件。Factorial5實例化時需要Factorial4Factorial4又需要Factorial3……直到Factorial0這個特化版本提供了出口。我在學(xué)習(xí)時問過自己既然C11就有constexpr函數(shù)了為什么還要研究模板遞歸因為兩者側(cè)重點不同。constexpr函數(shù)是可以被編譯期計算的普通函數(shù)寫法更自然適用范圍更廣但模板遞歸可以在“編譯期產(chǎn)生類型”比如根據(jù)整數(shù)常量生成不同的類型結(jié)構(gòu)這是constexpr函數(shù)做不到的?,F(xiàn)代C實踐中復(fù)雜元編程確實越來越少用“階乘”這種把戲但理解遞歸實例化對弄明白模板是怎么一層層展開出錯誤信息非常有幫助。5.3 元編程的局限編譯時間、可讀性與維護(hù)成本我見過有些開發(fā)者學(xué)會模板元編程后恨不得把所有邏輯塞進(jìn)編譯期結(jié)果項目編譯時間從十幾秒暴漲到幾分鐘。元編程是有代價的每一層模板實例化編譯器都要做一次“類型替換 模式匹配 代碼生成”復(fù)雜元程序甚至?xí)嵗汕先f個模板錯誤信息動輒幾百行。更麻煩的是可維護(hù)性。元編程代碼常?!胺慈祟悺睕]有正常的循環(huán)和變量只有遞歸和常量調(diào)試器里幾乎看不到運行時的中間值加了static_assert可能還好一旦缺少診斷信息后人維護(hù)時只能靠猜。我的經(jīng)驗法則很簡單能用constexpr函數(shù)算出來的就別用模板元編程能用運行期算的也別硬搬進(jìn)編譯期。模板元編程最適合處理的是“類型的選擇與轉(zhuǎn)換”比如判斷某類型是否滿足某接口、在不同類型之間做編譯期分發(fā)。至于業(yè)務(wù)計算交給constexpr函數(shù)和普通函數(shù)就好別為了炫技把整個項目拖入編譯地獄。6. C20 Concepts讓模板報錯從“天書”變成人話6.1 定義一個自己的概念直到C20之前模板的約束只能靠enable_if這種“負(fù)向篩選”。問題是當(dāng)約束不滿足時編譯器給出的錯誤信息往往是一大串“模板參數(shù)推導(dǎo)失敗候選模板被忽略”完全沒有告訴你“為什么失敗”。Concepts概念就是為了解決這個問題。概念定義看起來像對類型的一組“體檢要求”。舉個例子我想定義一個“可相加的”概念#include concepts template typename T concept Addable requires(T a, T b) { { a b } - std::convertible_toT; };這里requires后面跟的花括號是個requires表達(dá)式里面可以寫三類要求簡單要求表達(dá)式合法、類型要求typename后面跟的類型存在、復(fù)合要求{表達(dá)式} - 約束既要求表達(dá)式合法又要求結(jié)果滿足某個約束。上面的概念表示T類型要滿足任意兩個T對象相加的結(jié)果必須能轉(zhuǎn)換成T。如果某個類型不支持operator或者加出來的結(jié)果不是T概念檢查就失敗。6.2 把概念用進(jìn)函數(shù)模板的三種寫法定義好概念后約束函數(shù)模板有多種等效寫法我三種都在項目里見過// 寫法一requires子句 template typename T requires AddableT T add(T a, T b) { return a b; } // 寫法二約束模板參數(shù) template Addable T T add(T a, T b) { return a b; } // 寫法三約束auto參數(shù) Addable auto add(Addable auto a, Addable auto b) { return a b; }這三種寫法表達(dá)的是同一個意思選哪種更多是風(fēng)格問題。我個人的偏好是第二種template Addable T它把約束直接寫進(jìn)模板參數(shù)列表讀起來最自然。第一種適合約束條件比較復(fù)雜、需要多行requires表達(dá)式的情況。第三種雖然簡潔但適合用在約束很輕的場景如果概念本身很復(fù)雜會讓函數(shù)聲明顯得擁擠。概念帶來的最大好處是錯誤信息質(zhì)量顯著提升。當(dāng)你用一個不支持的類型去調(diào)用add時編譯器會直接告訴你“約束未滿足因為SomeType不滿足Addable”。雖然還是有一定閱讀門檻但相比之前滿屏的模板參數(shù)替換記錄已經(jīng)像人話了。6.3 概念對重載決議的影響與注意點概念不只是語法糖它還參與重載決議。簡單說更受約束的函數(shù)模板在重載時會勝出。比如template typename T requires std::integralT void test(T) { std::cout 整型版本 std::endl; } template typename T requires std::signed_integralT void test(T) { std::cout 有符號整型版本 std::endl; }如果調(diào)用test(3)兩個模板都能匹配但std::signed_integral比std::integral更嚴(yán)格多了“有符號”的限制編譯器認(rèn)為它的約束更“受約束”所以第二個版本勝出。這個機制叫約束偏序編譯器會自動比較兩個約束的邏輯包含關(guān)系。這里要特別注意一點約束偏序的判斷依賴于約束表達(dá)式本身的結(jié)構(gòu)不一定總能推導(dǎo)出“更嚴(yán)格”。如果兩個概念之間沒有明顯的蘊含關(guān)系調(diào)用時就會報重載歧義。我在寫具有多個約束版本的重載時會刻意給概念起名并保持概念的邏輯層級清晰比如Integral和SignedIntegral這種直接體現(xiàn)包含關(guān)系的命名重載決議和行為都更容易預(yù)測。7. 我踩過的模板編譯錯誤與排查思路7.1 從“no matching function”到真正的調(diào)用棧模板編譯報錯最常見的開頭就是error: no matching function for call to ...緊跟著一屏幕候選模板。剛開始我每次都從第一行開始讀結(jié)果一頭扎進(jìn)幾百行的“模板實例化調(diào)用鏈”里出不來。后來我總結(jié)出一個更高效的排查順序先看調(diào)用點的實參類型是否和函數(shù)模板參數(shù)匹配。比如傳了一個std::string但函數(shù)參數(shù)是const T這通常沒問題但如果實參是int*模板參數(shù)又是T推導(dǎo)結(jié)果就是int*后續(xù)函數(shù)體里若把它當(dāng)成整數(shù)用就會報錯。所以先確認(rèn)推導(dǎo)出來的T是什么再往函數(shù)體里看。其次檢查返回值類型相關(guān)表達(dá)式。很多“no matching function”并不是調(diào)用參數(shù)不匹配而是返回值類型所在的enable_if條件不滿足整個候選模板被SFINAE規(guī)則丟棄。最后才去看輸出列表末尾那幾行“實例化自”位置那里通常指向你業(yè)務(wù)源碼中真正出錯的那一行。編譯器的調(diào)用鏈?zhǔn)菑哪0宥x開始展開的最底部的層次往往才是你的業(yè)務(wù)調(diào)用點從下往上讀會更高效。7.2 模板定義必須可見鏈接期錯誤的定位還有一類錯誤不在編譯期爆發(fā)而是藏在鏈接期。典型報錯是undefined reference to void my_maxint(const int, const int)這個報錯信息里甚至有模板參數(shù)int但很多人第一眼看不出它和模板有什么關(guān)系。原因就是前面說過的模板的定義放在了.cpp里調(diào)用方頭文件里只有聲明實例化被迫中斷最后鏈接器發(fā)現(xiàn)找不到對應(yīng)符號。遇到這種報錯排查路徑是先去檢查該模板定義所在文件是否被包含在調(diào)用方的編譯單元里再確認(rèn)是否有人在.cpp里做了顯式實例化但拼錯了類型。另一個容易忽略的情況是類模板的靜態(tài)成員定義忘了寫這也會在鏈接期出現(xiàn)類似“undefined reference toBoxint::count”的報錯解決方式是回到類外補上模板靜態(tài)成員的定義。7.3 用靜態(tài)斷言和“類型打印”工具輔助診斷排查模板類型推導(dǎo)問題時我特別依賴一個“手工類型打印”的技巧。核心思路是寫一個故意不定義的模板類讓編譯器在報錯時把類型“帶”出來template typename... struct TypePrinter; // 故意不定義 template typename T void debug_type(T) { // 觸發(fā)編譯錯誤報錯信息中會顯示T的類型 static_assert(sizeof(TypePrinterT) 0, 查看T的類型); }只要某個地方調(diào)用了debug_type(expr)編譯器就會在static_assert那里報錯錯誤信息里會顯示TypePrinterint或者TypePrinterconst char ()[6]這類類型全名。這種手段在排查引用、const、數(shù)組退化的推導(dǎo)問題時比任何調(diào)試器都好用。另一個常用工具是static_assert搭配類型萃取static_assert(std::is_samedecltype(x), int::value, 這里推導(dǎo)出來的類型不是int);一旦條件不滿足編譯器會把你寫的提示信息打印出來。我現(xiàn)在的習(xí)慣是在寫復(fù)雜的模板函數(shù)時先在關(guān)鍵推導(dǎo)點放幾個臨時的static_assert確定類型無誤后再刪掉。這比依賴IDE的類型懸停提示更可靠因為編譯器的推導(dǎo)結(jié)果才算是最終事實。最后再分享一點我的個人體會。模板學(xué)習(xí)切忌只看語法一定要親手編譯看報錯修報錯。我建議初學(xué)者不要急著上模板元編程先把函數(shù)模板、類模板、特化、變參模板這四塊跑熟再試Concept。模板報錯確實難看但看得多了你會發(fā)現(xiàn)它其實有規(guī)律可循編譯器會把整個實例化調(diào)用鏈展開你只要從最底層的一條開始看。后續(xù)我還會繼續(xù)整理模板相關(guān)的學(xué)習(xí)筆記比如模板參數(shù)推導(dǎo)的完整規(guī)則和約束偏序的細(xì)節(jié)那又是兩個大坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人妻精品4K4K4K4K4| 国产区性爱在线视频秋霞豆| 欧美第二页| 日韩性爱电影一区| 亚洲一二三四区在线免费看视频 | 亚洲囯产精品女人久久久| 欧美另类自拍| 岛园激情| 一区二区不卡视| 午夜激情床戏激情| 午夜理论片在线观看免费| 亚洲国产97| 天美欧美国产| 欧美精品久久久久久久久88| 狠狠色伊人亚洲综合网站色| 18禁网站在线播放| 国产诱惑| 日韩人妻大香蕉| 国产99999| 72av视频| 亚洲诱惑| 六月丁香五月婷婷| 无码操逼网| 哈哈操 大香蕉| 日本超碰在线国产一区| 国产男女无套视频免费观看| 国产成人亚洲精品无码最新在线| 美国三级日本三级久久99| 久久久97| 免费观看成人www精品视频| 亚洲欧洲色情高清| juliaann丝袜大战黑鬼| 懂色综合久久久| 亚洲一区操| 国产黑白丝在线| 偷拍欧美激情| 色女网日韩| 日韩人妻精品久久久久| 九九热九九热| 91校园春色长篇| 最新日产中文在线麻豆| 依人大香蕉| 日韩欧美中文| 日本人妻中文字幕| 伊人久久AV诱惑悠悠| 美日韩一二三区| 天堂蜜桃无码视频一区二区| 亚洲色吧网| 成人福利视频网| 日韩国产乱子伦App| www.色操逼| 香蕉久久AⅤ...| 男人a天堂手机在线版| 久久91视频| 色久桃花影院在线观看| 国产亚洲精品美女久久久m| 蜜臀久久99精品久久久久久无删减 | 欧美日韩99| 精品久热| 亚洲熟女中文字幕在线| 五月天婷婷综合| 岛国在线一区二区三区| 日韩精品一区的| 91视频国品一二三区| 亚洲另类综合欧美| 成人欧美日超碰| 97精品久久久久久久| 中文字幕二区日韩天堂| 丁香婷婷激情五月天无毒不卡 | 四虎免费视频| 97超碰超碰| 91亚洲色人| 中国一级操逼视频| 国产一区在线免费播放| 区一在线观看| 久久男人| 玖玖爱免费观看视频| 激情五月综合网| 动漫片子网站3黄| 99热精品在线| 曰本道人妻久久久在线不卡色视频| 人人操人人精品影片| 欧美午夜视频| 天天日熟妇| 天天做天天爱| 色色色色网站| 嗯嗯,好大,好爽,好骚| 操老熟女AV| 久久夜夜| 亚洲天堂中文字| 99色视频| 亚洲天堂资源在线| 国产精品熟女丝袜一区二区| 青青草在线视频人人想人人上| 午夜福利久久久噜久噜久久综合| 少妇三p| 一区二区三区免费岛国片| 又大又长又爽| 免费国产视频| 久久综合激情| 久久嫩草国产成人一区| 99久久99九九99九九九| 人妻啊啊人妻啊啊| 蜜区区视频79 | 北条麻妃99精品青青久久| 天天操天天日天天干| 亚洲 欧美 日韩 国产一区二区| 丁香婷婷久久| 69XX一中文字幕人妻91| 国产视频三区四区| 色噜噜狠狠色综无码久久合欧美| 久久 国产精品 一区| 超碰天天久久79| 野狼福利社区| 2020视频1区2区3区| 呦女网站| 婷婷精品视频| 97在线公开视频| 激情久久久| 欧美激情黑人| 强奸a片网| 国产高清在线自在拍69| 午夜福利免费福利视频| 一二三四区电影| 高清国产无码av| 欧美在线播放aaaa| 欧洲特黄毛片免费看欧洲毛片| 日本一区二区三区四区免费观看| 丰满人妻一区二区中文| 亚洲国产精品99久久久| 国产热av| 婷婷色婷婷| 猛猛干| 中文字幕狠狠玩| 加勒比五月天| 综合操逼| 国产精品人妻无码久久久互動交流| 99久久99久久综合| 另类图片欧美激情综合| 中国黑人三级片网站上区| www.色吧5.com| 熟女天天干| 无码WWW免费视频网站| 人妻大香蕉| 婷婷综合久久| 四虎午夜影院| 一本色道久久综合精品婷婷| 国产地址二三| 九色视频91| 亚洲视频中文一区| 日本三级精品| 九九激情网| 熟妇综合一区二区三区| 加勒比伊人综合| 国产三级电影免费观看| 国产亚洲福利第一页丝袜| 蜜臀久久在线视频| 精品一区二区啪啪啪| 超碰97人妻免费在线| 亚洲精品国产熟女久久久| 五月婷婷大香蕉| J?P?NESEHD熟女熟妇伦| 中国少妇啪啪视频| 亚洲一区二区三区麻豆传媒| 91黑人无码激情在线| 激情小说亚洲色图| 日韩二区三四区五区六区在线看| Av色五月| 久久综合激情| 无码高清专| 肉动漫无遮挡h在线观看| 蜜桃臀一区二区aV| 精品人妻一区二区三区-国产精品| 欧美性爱三区二区| 国产精品一二三区18| 黄色成年| 亚洲色婷婷综合久久一区二区三区| 超碰97男人| 91精品微拍福利| 91精品久久久久| 伊人精品视频| 吉川爱美98堂在线| 欧美性爱www免费版| 人人操,人人液| 亚洲少妇视频| 成人久久久精品| 九九热九九热| 黑丝内射一区二区三区| 日韩人妻一区二区精品| HEYZO高无码国产精品227| 最新日日夜夜天天干干| 国产无马在线| 欧美人人曰人人操人人射射| 啊啊啊啊操死我| 亚洲欧美综合网站| 日本最新1区2区3区| 夜夜久久| 自拍二页| 美女网站黄页| 色悠久久久av| 丝袜色综合| 另类视频在线| 日本中文字幕熟妇| 亚州国产成人精品女人久久| 亚洲性少妇| 97这里只精品| www.男人天堂| 伊人96在线| 人妻人妻天天碰| 亚洲精品国产av天美传媒| 欧美婷婷久久| 在线天堂资源亚洲| 大香蕉欧美| 亚洲天堂男人天堂网| 久操国产在线| 欧美日韩大香蕉| 亚洲精品自拍| 天天草夜夜草高潮片| 亚洲密乳AV| 欧美性爱日韩高清| 综合久久久久久久综合网| 中文字幕欧美丝袜07资源| 色网色网色网色网色网色| 97资源久久| 热99这里有精品综合久久| 99超碰网| 欧美 亚洲 在线| 91久久久久| 欧美综合色图片| 亚洲国产天堂| 国产1024在线播放| 性爱视频啪啪啪啪| 国产一级αv免费看片| 欧美翘臀视频网站一区二区三区 | 国产精品视频精品一二| 日韩小电影| 久久久久久中文| 91性高朝久久久久久久久| 人人扣人人操| 色婷婷综合久久中文字幕雪峰 | 九九九九久久久久| 伊人一区二区在线播放| 黑人精品成人一区二区三区| 精品国产网站| 欧美97av| 99re公开精品免费视频| 久综合网| 97爱b| 激情婷婷黑人91| 亚洲欧美日韩免费观看| 国产激情久久| 一牛一区二区三区久久| 欧洲综合色图| 新版天堂中文资源8在线| 久久久精久久久| 亚洲偷91色| 91综合色| 第一高清av中文字幕| 熟妇一区二区三区| 欧美日韩亚洲天堂| 日本精品一区二区中文字幕| 亚洲永久AV无码精品秋霞| 婷婷五月天色网| 日韩乱伦AⅤ| 久久精品国产精品亚洲艾通辽熟妇 | 一区二区高清视频| 男人的天堂一区三区| 国产精品天美传媒| 亚洲 日本 不卡| 日韩丰满熟妇| 欧美天堂超碰97| www国产无码| a久久| 国产精品农村妇女精品| 自拍偷拍 高清无码| 人妻出轨一区二区三区| 久夜视频| 神马精品视频| 人人污日韩一区二区| 日日骚av| 欧美很很操视频| 国产精品一区二区后入| 无码人妻一区二区三区色欲aⅴ | 大香蕉欧美国产日韩高潮| 久久系列| 97AV爱| 欧美在线天堂| 五月婷婷激情| 熟妇熟女一区二区三区| 亚洲综合另类欧美久久久| 777超碰| 麻豆这里只有精品| 日夜精品| 国产精品一区二区三区在线密挑| 日日摸日日碰夜夜爽视频| 999国产精品999| 97超碰中文字幕| 国产精品干干干| 日本五十路在线| 日本1区2区不卡视频| 少妇与黑人高潮在线| 国产精品盗摄 偷窥盗摄| 亚洲AV资源| 免费成人在线观看91| 狠狠操一区二区| 亚洲日本激情| 啊啊啊啊啊啊啊啊啊在线观看| AV网站高清无码在线观看| 欧美午夜视频| 一区二区三区机械有限公司| 夜色91| 人妻密肉在线观看| AV和黑人在线播放| 内射中出日韩在线观看视频| 人人人摸人人| 亚洲色图 综合| 蜜乳AV一区二区三区四| 久区视频| 欧美激情超碰777| 美国一区二区三区视频| 亚洲色天堂九9| 日韩AV片| 无码精品一区二区三区潘金莲| 91在线一起| 95人妻爽爽人人做人人澡| 国产精品女aA片爽爽视频| 粘花网06av视频| 少妇3P性爱自拍| 国产精品另类一区大香蕉| 97人妻色| 国产精品无码AV网站| 78精品在线| 99国产精品在线观看| 99国产在线 精品 视频| 91五十路| 90后后入| 一区二区三区蜜桃成人撸久久东京热| 黄色一级视| 免费视频在线一区二区不卡| 高清不卡 中文 人妻| 激情综合97| 亚洲第2页| 亚洲婷婷丁香在线| 98超碰欧美| 欧美国产有色电影| 打av高清| 日韩人妻操B| 久久久久久精品免费看A级| 国产精品久久久 | 欧美在线视频观看一二三四区高清| 五月丁香六月激情| 国产成人无码高清| 澳门黄片一香蕉视频| 亚洲欧美变态| 国内外激情在线| 久9久9精品| 人妻天天夜夜爽一区二区| 91精品啪在线观看国产城中村| 91P0RNY大屁股人妻| 这里只有97精品| 91精品国久久久久久无码| 美女啊啊啊啊啊啊啊| 无码国产精品久久久久| 久久久久免费看少妇A片特黄| 色妺妺AⅤ| 欧美女同在线| 国产丝袜高跟美女av免费观看| oumeisetupian| 国产精品青青草| 丁香六月激情综合| 日韩一级欧美一级在线观看| 激情久久av一区av二区av| 日韩久久.一级黄色片| 中文字幕欧美日韩三级| 神马久久久久久| 九热久| 91蜜臀人妻中文字幕在线| 老司机久久| 亚洲欧洲无码97久久精品| 成人精品电影| 四月丁香婷婷| 色哟哟-国产专区| 中文字幕在线观看AV| 综合网,亚洲,欧美| 天天干2019| 蜜臀久久久久久999| 床上啊啊啊一区二区三区| 日日夜夜狠狠| 国产嫩草精品A88AV在线| 蜜臀精品1区2区| 亚洲情色第一页| 这里只有精品视频| 人妻在线臀日韩| 九九九网页| 青青草视频在线观看一区二区| 五月天伊人| 中文字幕天天操| 欧洲精品人妻| 骚日日av| 97免费视频在线观看| 天堂v无码免费视频| 日韩免费看在线黄色片| 91美女视频| 亚洲熟伦熟妇AV无码春色| 国产精品久久妻无码网站| 日韩黄片视频试看| 亚洲AV无码成人精品久久| wwwcaobibi| 色99视频| 啊啊啊97视频| 丝袜美腿91| 天天色图| 激情小说成人日本无码一| 午夜精品视频777| 精品一区二区啪啪啪| 亚洲色图 欧美热图 清纯唯美 另类自拍| 男生女生啊啊啊啊| 超碰导航97| 亚洲欧洲成人在线电影| 日本国产高清色www视频在线| 99精品在线| 91人妻视频在线| 久久9999 | 青娱乐日韩无码| 又黑又大又粗| 91精品国产乱码| 精品九九九九| 玖玖爱免费观看视频| 精品一区二区三区蜜桃臀赵总| 二级久久网| 全国男人天堂网| 久久黄片国产一区二区| 九九碰九九爱97| 东北女人| 九九热AV| av资源在线观看少妇| 91夜夜蜜桃臀1区2区3区| 精品十八在线观看| 久久成人国产| 青青草在线视频欧美| 97色操| 高潮的A片激情扒开一区| 亚洲第一在线视频| 无码人妻毛片丰满熟妇精品区| 国产精品福利资源在线尤物| 黑丝少妇| 97视频一区| 亚欧无码在线| 亚洲 日本 不卡| 浪人综合网| 青草香蕉网| 婷婷丁香激情| 91蜜臀熟女| 欧美在线电影| 色婷视频| 竹菊一区二区三区AV线| 女人爽到高潮潮喷18禁网站| 欧美色色人| 精品久久久高清无码| 欧美综合加勒比在线| 国产h小视频在线观看免费| 91狠狠综合久久久久久| 91欧美少妇| 国产中文字幕曰本毛片| 欧美日韩中国x| 欧美日韩国产黄色片| 午夜精品久久久久久久99热影院| 免费视频在线一区二区不卡| wwe 天天干.com| 欧美18老人禁| 嫩草伊人久久精品| 午夜乱轮操逼视频免费看| 九九热免费国产视频婷婷伊人五月 | 老司机香蕉久久久久| 欧美激情综合| 蜜臀久久99精品久久久久久婷婷| 一区二区三区精品黑丝白丝酒店对鸡| 91亚洲影视| 亚洲色偷偷色噜噜狠狠99网| 九九九九久久久久| 97高清啪啪| 日韩免费高清大片在线| 最新av在线| 久久综合资源一区二区| 997色在线| 日日操天天操| 国产偷拍网站| 动漫av中文| 99久久精品国产高潮| 67914在线兔费成人视频| 天天干,夜夜爽| AAAA级日本片免费视频| 九九九九九九九九九五码| 伊人五月天激情| 欧美综合综合| 精品久久久久黄少妇| 少妇xx精品| 在线洲亚线| 欧美78p| 2020中文在线一区二区三区| 亚洲综合色图欧美| 久久久久密| 中文字幕交换人妻| 日韩欧美传媒一区国产| 欧美亚洲AN| 欧美一级做a爰片免费视频| 啊啊啊无码| 97资源免费视频| 日本精品一区二区中文字幕| 日本一道在线播放高清| 呻吟 欧美 日本 中出| 极品色社| 一级特级aaaa毛片免费观看| 九九碰九九爱97超碰| 欧美日韩另类字幕中文| 2025亚洲男人天堂| 99久久99久久综合| 国产成人欧美一区二区三区的国产| 日韩无码服务区| 欧美无圣光在线| 97久久超碰| 亚洲小电影免费涩涩成人在线高清| 欧美色图校园春色| 99re在线视频国产| 色第一页| 狼人综合婷婷激情四射 | 五月天综合| 亚洲色 国产 欧美 日韩| 国产激情视频一区区三区| 亚洲 无码 有码 中文字幕| 日本青青草在线| 91丨九色丨东北熟女| 999亚洲国产视频| 91在线免费精品视频| 密臀国产在线| 九九九九97| 久操 高清| WWW4虎| 人妻少妇色综合| 人看人人摸人人操| 国产无马视频| 国产精品亚洲天堂网址| 亚洲精品一二牛牛| 欧美高清18A片| 国产60页| 亚洲熟妇一,二,三期| 97伊人| 婷婷久久久精品| 日本道日本道中文字幕日本道最新日本道在线观看 | 超碰在线97国产| 亚洲一二三四区机械| 91麻豆天美国产欧美| 九九碰九九爱97| 狼人久草| 婷婷色一区| 96精品在线| 国产精品交换一区二区| 天综合网| 性欧美体内射精| 日本精品人妻少妇一区二区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 超碰人人超在线观看| 久久av成人无码免费| 女人 A一级| 亚洲色 国产 欧美 日韩| AV免费在线播放一区| 一级啊性爱在线视频| 国产又粗又长又爽又色| 桃色五月天| 国色天香av| 91扒丝袜综合在线| 1024手机看片欧美日韩| 欧美精品,四区。五区| 免费男人的天堂| 人妻熟女一区二区三区视频| 美女网站91| 免费视频在线一区二区不卡| 在线国产福利网址导航| 日韩性爱播放| 最新加勒比丝袜在线| 91在线视频免费中出| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 日韩国产欧美伦理在线| wwwcaobibi| 超碰人人妻| 91色综合激情| 亚洲少妇免费视频\| 青青草公开在线免费不卡视频| 久久αⅴ| 亚洲综合另类小说色区亚洲成av人片在www| 色欲蜜臀AV| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 青青在线视频日韩欧美| 国产一区二区在线播放量| 成人免费福利在线观看| 综合色图,成人综合网| 久久久久ab| 啊啊啊水好多| 久久久亚洲Av| 亚洲宅男天堂| 传媒免费一区二区三区| 91高潮| 18禁美女裸体无遮挡啪啪| 超碰av在线| 精品乱码久久久久| 日韩精品-原创伙伴| 高潮的A片激情扒开一区| 97久久久| 天天射夜夜| 日本影视久久免费| 亚洲国产无码精品首页久久久| 精品久久久久瑟瑟| 东北女人高潮视频| 人妻人人做人人澡人人爽欧美一区| av优播| 久久久免费视频18| 吖在线不卡一区二区国产剧情| 日韩在线观看中文字幕视频| 人妻爽爽啪视频| 91色狼| 午夜精品视频777| 亚洲欧美精品久| 欧美激情综合| 激情综合五| 亚洲图片在线| 日韩精品国产一区二区| 91丝袜美女| 天天欧美| 中文字幕黄色片| 长久操视频| 国内亚洲高清无码| 美女露胸露屁股| 在线天堂资源亚洲| 成人性爱电影网| WWW美腿丝袜香蕉中文| 尤物视频一区| 5252色欧美在线| 国产精品 视频| 又黄又爽在线观看视频 | 国产精品岛国片在线观看| 中文字幕十五区| 日韩字幕一区| 亚洲情色一区三区| 日韩欧洲操屄视频| 狠狠搞 亚洲91| 无码高清少妇久久| 好好的日:com久久九九| 欧美1区二区三区公司| 四虎AV无码| 精品人妻一区二区三区四区石在线| 日韩另类色图| 欧美性天天| 春色校园综合网| 日本孕妇一区二区视频操逼免费看 | 免费观看一区| 91色噜噜狠狠| 26uuu偷拍亚洲欧洲综合| 天天摸夜夜操视频| 欧美日韩国产中文精品字幕自在自线| 国产精品久久久久久久免牛肉蒲团| 国产AV色黄看到爽| 精品人妻一二三四区视频| 无码高清专| 美女91网| 蜜桃久久久久久| 91精品久久久| 欧美色老汉| ′ !γ}丶。。久久精品欧美一区二区三区| 婷婷综合伊人一区| 欧美熟女激情| 91精品人妻电影| 99re黄 | 少妇一区二区三区| 久久精品老司| 久久久国产成人一区二区三区在线| 色噜噜日韩精品| 久久9久9久99久9久9| 欧美在线干| 91精品人| 亚洲欧洲无码一区夜| 亚洲砖码砖专无区2023| 99999国产精品| 第四色色综合91| 亚洲砖码砖专无区2023| 久久久少妇| 少妇丝袜在线观看AV| 国产强奸乱伦xd| 国产探花日韩援交| 久久精品无码不卡| 亚洲天堂女优在线| 新婚人妻扶着粗大强行坐下| 99在线精品视频| 国产美女精品| 狂操嫩妻视频一区二区三区| 操迟操逼在巾线Fre看| 亚洲清纯综合| 久久久性爱视频| 婷婷大香蕉| 日本不卡高清视频| 久久免费少妇| nuu12国产麻豆精品| 色呦呦、国产精品| 日本午夜久久电影| 国产精品毛片?v一区二区三区| 精品人妻丰满熟妇一区二区三| 禁十八久久| 伊人久久88国产女| 日亚韩精品视频二区三| 国产AAAAAABBBBB| 久久久久久久唑| 蜜桃网熟妇| 亚洲综合九| 亚洲男人的天堂一区二区| 午夜大香蕉| 日本理论在线| 人人摸人人摸人人干| 操人人| 啊啊啊免费视频| 亚洲乱熟女一区二区| 操逼999| 99re8超碰| 67914亚洲精品| 欧美日韩少妇色情| 中文字幕精品人妻丝袜| 亚洲,欧美,春色,另类| 国产亚洲综合欧美一区| 中文字幕成人理论在线| 思思热在线cao| 日本黄色大片一级视频免费麻豆| 中文乱码字字幕在线第5页| 亚洲成成熟女人综合一区二区| 加勒比性爱成人在线| 一二三四视频在线社区中文字幕| 99久久综合| 91在线色| 60秒免费小视频| 久久一二三四五六七八九区区| 久久夜夜夜夜| 欧美亚洲日韩16色| 欧美亚洲涩涩| 日本精品一区二区三| 本道在线| 欧美97免费| 国产一区二区在线看| 91日韩网站| 欧美78P| 亚洲国产成人精品女人久久久| 久久久日本电影| 国产精品白丝| AV麻豆免费一区| 午夜操逼不卡| 日韩午夜精品一区二区三区电影| 久久肏大逼| 久久久久婷婷| 天美av在线观看| 五月天伊人| 中国熟女网站| chaopen97久久| 易易A毛视频| 91av熟女人妻| 色yeye成人免费视频| 欧美亚洲日本激情在线| 午夜精品久久久久久久男人的天堂 | 男人的天堂com| 男人天堂欧美| 一级@啪啪视频| 大伊香蕉在线视频免费| 久久99热这里只频精品6学生| 偷拍 亚洲| 欧美在线55555| 日本最新1区2区3区| 亚洲猛交| 91美女在线视频| 99久在线精品99re8蜜桃| 国产精品极品美女视频| 精品人妻美妇91job| 素人美腿视频网站| 超碰人人在线| 老熟女91| 欧美精品99久久久**| 中文一区在线视频| 久久久草草精品| 欧美天天弄| 俺去俺来也在线www| 97精选久久| 国产天天骚| 97超碰天天爱天天爱| 日本性一区| 探花精品 一区二区| 人人操肉肉| 亚洲欧美大香蕉| 色女免费在线观看视频网址| SUV一区二区在线看| 久久大黄片| 黄色交缠性感爆操91国产精品免费一区二区三区 | 九九九久久久久| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 亚洲精品久久久久久| 午夜舔阴达高潮视频免费看| 日本在线播放不卡一区| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 夜精品久无码| 久久午夜色播影院免费高清| 99久久久久久久久| 午夜欧美J进J出白浆流出久久久| 青青草在线视频播放器| 日逼视频日本| 欧美一区二区情色| 91第一页| 国产精品99久久久www| 九热大香蕉| 精品国产Av无码久久久伦古装| 国产AV无码AV| 99久热精品99re6热| 午夜啪| 激情丁香五月| 97色欧洲| 国产成人www免费人成看片| 欧美暴力猛交| 久久中文字幕一区不卡| 九九久久首页| 黑人娇小av在线播放| 激情丁香五月婷婷| 一二三区精品视频| 婷婷色婷婷| 亚洲AV噜噜狠狠网址蜜桃动漫| 久久熟女人| 熟女精品日韩一区二区三区 | 91色宗合| 蜜臀少妇一区二区| 夜夜欢天天干| 久久久蜜桃一区二区三区| 色色97爱| 婷婷九月| 九九九九九九视频免费| 欧苏综合色综合| 久久久人妻| 十八禁网站在线| 男人的天堂 在线一区| AV天堂丝袜| AAAA欧美日韩| 久久久久久九九九九-美女久久久久久久-成人AV| 亚洲国产综合图区中文字幕| 久操九九九九| 被窝影院午夜看片无码| 少妇69中文| 超碰人妻天天干| 中文字幕二区| 伊人五月天| 三上悠亚在线毛片91| 超碰97资源大奶| 亚洲国产ⅴ高清在线观看| 超碰97首页| 国产超碰| 98久久| 一及黄久一点| 这里只有精品视频在线观看麻豆 | 色官网在线| 亚洲综合20p| 麻豆国产av网| 操逼1区| 欧美亚州综合网图片| 91亚洲黑人| 三级AV入口| 97国产精选| 国产馆极品诱惑| 日韩中文字幕精品一区在线| 久久久成人免费av电影| 伊人久久88国产女| 欧美熟妇成人一区二区| 91网站在线播放| 四虎AV在线观看| 7777奇米影视久久| 天美传媒精品久久视频| 殴美综合色88| 大地资源在线观看中文第二页| 中国人高清www色视频免费| 欧美日本天堂| 激情综合亚洲| 日逼视频日本| 人妻铁牛TV| 在线中文AV| 欧美九九爱| 日本一级性爱| 无码外流操逼视频| 麻豆一区二区三区在线看 | 精品视频一区二区| 亚洲国产亚洲天堂| 清纯唯美激情四射| 色丁香久久| 国产精品点击进入在线影院| 亚洲高清综合网| 91无码人妻| 九九玖玖精品| 97人人干| 精品国产乱码久久久久久口爆网站 | 日韩人成网站在线播放| 中英熟女操女| 久久久久久九九九九九 | 欧美一级A片在线看视频性色| 亚洲成人激情小说视频| 久久久一二三四区| 97精品久久久久中文字幕| 97色在线观看| 婷婷色在线| 国产十八禁视频| 亚洲另类久操网| 婷婷亚洲综合| 探花激情视频| 强奸乱伦av电影| 亚洲无码太久| 日本韩国国产精品一区| 超碰人妻久久| 伊人性在线视频| 夜色97| 少妇色综合| 精品一久久久| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 求求你操操我| 久久国色天香香蕉| 爽爽歪在线视频| 亚洲婷婷五月天| 五月丁香综合激情| 妺妺跟我一起洗澡没忍住| 四虎影视永久在线免费| 日韩人妻有码免费视频| 一本色道综合久久欧美| 中英熟女操女| 亚洲国产美女久久久久| 亚洲无码com| 亚洲中文字幕精品一区| 百度百度日本操逼| 日韩av在线精品观看| 国产 日韩 欧美一区| 激情文学88| 囯产精品久久久久久久久久梁医生| 五月丁香激情四射| 婷婷色综合欧美日韩| 免费精品无码一级毛片牛牛影视| 久久久久久精| 青娱乐999| 无码一区二区精品视频久久久春药| 日韩熟女操逼| 91在线超高颜值国产| www.久久最新地址| 国产亚州高清国产拍精| 综合色99| 97日本超碰综合| 日本不卡码黄色| 久操 高清| 久久美国毛片| 亚洲天堂另类| 蜜臀久久99精品久久久久久无删减| 日本精品五区| 日韩精品一区二区高清 | 丝袜狠狠草尤物 91| 性欧美| 久久久久白虎| 亚洲人成网站7777| 乱伦a片视频| 婬女免费一二三区A片| 亚洲天堂电影精品一区| 一个人在线看的黄色电影网站| 天天夜夜久久| 欧美96交| 国产激情视频一区区三区| 国产成人精品必看| 9999免费精彩视频| 亚洲熟妇乱女区二区三区| 日韩不卡码| 97中文综合| 人人搞人人插人人操| 久草国产在线视频| 黑丝内射一区二区三区| 成人在线视频一区| 国语精品对白| 国产多人在线观看视频| 欧美性爱另类综合| 中文字幕少妇色| 国产AV天美传媒一区二区三区| 国产精品国产精品国产| 曰韩操B| 翘臀vidoes| wuyechaopeng| 久草尤物| 任你草| 久久综合av| 狠狠干91| 国产99 中文字幕日韩小视频| 青青草原综合久久大伊人精品| 国产蜜臀在线| 婷婷在线视频在线观看| 另类在线| 日韩亚洲97| 91在线精品一区二区三区| 极品极品色影院| 艳尻美人妻| 97国产超碰| 操逼逼无码| 成年人黄色视频免费| 无码免费精品高清| 9精品在线| 又大又大又大又粗爽高潮观看 | 欧美高清91| 婷婷午夜成人色中色| 欧美色图亚洲色图成人在在线| 精品无人区麻豆乱码1区2区图片| 精品午夜福利国产一区二区在线观看| 黄色污污污污污污网站| 成人AV在线网站| 伊人激情五月天一区二区| 国产白嫩精品久久| 男人久久天堂| 激情五月天综合网| 天天影视综合色| 亚洲成熟国产精品美女| 超碰人妻中文在线| 国产乱伦搜索结果91P| 99国产人成精品| 久久久久久久久久久久色网| 国产精品岛国片在线观看| 国产成人天堂| 26uuu偷拍亚洲欧洲综合| 97久久精品亚洲中六字幕| 国产精品久久久| 亚洲日本韩国极品一区二区| 日日夜夜骑| 97色色色| 久久内射| 91视频国品一二三区| 猛猛干| 97人妻色| 极品国产内射| 精品国产污一区二区三区| 一区二区三区国产在线播放| 美女啊啊啊啊pc| 日韩兔费看黄片| 久久久工口| 五月丁香六月综合缴清无码| 日韩一级二级在线| 玖玖爱在线视频免费观看| 中文字幕精品人妻丝袜| 中国农村熟妇毛片视频| 九九热超碰97亚洲最新香蕉| 国产乱伦性爱区| 天美欧美国产| 国产无马视频| 天堂亚洲精品| 91麻豆天美国产欧美| 热99这里有精品综合久久| 韩日男人的天堂| 日本高清视频xxxx| 日本熟妇精品九九| 欧美黄色片AAAAA| 欧美性暴力猛交| 殴美牲| 久久伊人亚洲AV无码网站| 玖玖草久草99蜜月一区二区三区| 欧日a| 99re超碰| 国产美女激情| 亚洲最大网站av| 97亚洲中文| 久久免费看高潮毛片韩国| 97精品熟女少妇一区| 亚洲清纯综合| 精品99999久久久久久| 久久天天艹| 蜜桃AV天堂| 99999精品视频| 久草网站免费在线观看| 日日不卡av| 美女主播色欲91抠b在线播放| 午夜精品探花| 人妻少妇久久中文字幕一区二区 麻豆 | 后入式999| 伊人影院中文字幕| 国产91乱伦| 少妇蹲下露出大唇5| 区一二区日韩亚洲乱码av电影| 综合久久六月久久婷婷| 欧美色图91| 国产美女激情| 99色色| 久久亚洲AV无码专区首页| www.男人的天堂| 成人久久久精品| 黄色乱论网站| 久久久久国产精品片区无码直播| 久久免费少妇| 欧美亚洲高清晰| 精品一区二区三区最新| 国产91久久九九免费精品无码| 国产色产精品在线观看 | 国产剧情AV不卡在线观看| 精品午夜福利导航| 超碰久草| 亚洲吊色| 四虎永久在线精品免费网址| 91三级理论片播放器| 欧美一区二区三区不卡高清视频| 亚洲熟女少妇免费视频| 91+欧美| 999在线电影香蕉| 日韩激情啪啪| 亚洲天堂一区二区久久| 欧美色乱| 色九九久九九| 91视频综合在线| 精品乱子一区二区三区99| 中文字幕 人妻不满 在线视频| 操逼操逼逼操操逼91| CCYY草草影院地址入口| 亚洲欧美日韩激情不卡| 白嫩91在线亚洲| 蜜桃丰满熟妇av无码区不卡| 91扒丝袜综合在线| 在线观看一卡二卡| 国产67194| 亚洲黄网在哪免费看| 免费精品中文字幕| 伊人青青一区成人视频在线观看区| 国内自拍 日韩激情 99| 3d成人精品一区二区| 免费观看国产小粉嫩喷水精品午| 欧美人黑A片无码免视费| 中文字幕丝袜| 天天射天天色成人| 欧美色图99| 一本大道久| 狠狠97| 青青草在线视频播放器| 久久久久深夜无码| 99无码| 天天影视之亚洲综合网| 精品然女一区二区| 亚洲狼狼干综合1| 欧美天堂日韩三级国产传媒| 99热免费| 桃色六月天| 啊啊啊好湿久久| 精品国产污一区二区三区| 草b在线| 麻豆福利视频导航| 欧美丝袜激情| 欧美伦乱爱| 青青草玖玖爱| 亚洲脚交| 亚洲精品国产拍免费91在线| 东北老熟女| 丝袜亚洲综合| 精品无码一区二区三区色欲| 亚洲人成网站7777| 久热影视| 青娱乐国产精品| 日韩AC| 欧美1727免费观看视频| 久久久久久性爱片| 亚洲熟女乱熟乱熟妇综合网二区| 亚洲色香|