C 備忘錄030 模版式的「建構函式」

2021-09-29 23:10:41 字數 850 閱讀 3823

#include

#include

#include

class

xfriend std::ostream &

operator

<<

(std::ostream &os,

const x &x)

private

: std::string name;};

intmain()

; x d1

;// without enable_if, this line won't compile

std::cout << d1;

}

這個模版可以取代任何構造、拷貝構造和移動建構函式,並且由於模版不被認為是特殊函式,所以類的所有特殊函式依舊預設生成

但問題是,拷貝建構函式的優先順序有時低於這個模版函式。因為編譯器預設產生的建構函式簽名是x(const x &),而x1是乙個非const左值,所以模版函式是更好的匹配,而x1不能賦值給std::string,所以x d1會編譯錯誤

所以在拷貝的時候,要用enable_if來sfinae掉這個模版函式(如果s1不能構造std::string,即賦值給name的話,此模版被移除),使預設拷貝構造匹配

p.s.enable_if語句也有用std::enable_if_t>取代的,兩者間是否有微妙區別我也不清楚,此處心中沒底…

C的I O函式備忘錄

int getc file 1.可能實現為巨集 2.出錯或達到檔案尾返回eof int fgetc file 1.一定是函式 2.出錯或達到檔案尾返回eof int getchar voiid 1.從標準輸入讀取,等價於fgetc stdin 2.出錯或達到檔案尾返回eof int ungetc i...

boiz 的 C 備忘錄(一)

本文主要是記錄一些初級的但是有時候我自己容易忽略或者忘記東西,僅作備忘錄之用。1 銜接符 在c 中可以作為銜接符 忘了規範的術語是不是這麼叫了,汗自己乙個 例如 this is memo this is memo too 上面兩行在c 中,編譯器會認為是一行。不過 一般只在巨集定義中使用,因為如果是...

boiz 的 C 備忘錄(二)

1 c 函式引數入棧順序 從右到左 下面的例子用來驗證c 函式引數入棧順序 void test int i1,int i2,int i3 printf i1 d,i2 d,i3 d n i1,i2,i3 int i 0 test i,i,i 則輸出結果為 i1 3,i2 2,i3 1 2 乙個有趣的...