起因來自於《c++併發程式設計實戰》的這樣乙個例子
#include #include我「靈機一動」,將main函式變成了這個亞子:#include
class
scropethread
}~scropethread()
scropethread(
const scropethread &) = delete
; scropethread& operator=(const scropethread &) = delete
;private
: std::thread m_pthead;
};void fun(void
){}int
main()
int編譯器毫不猶豫的給我報錯了:main()
乙個是先定義了乙個thread物件t1,然後用將t1作為引數傳入scropethread的建構函式,乙個是定義了乙個臨時的thread物件,然後將其傳入scropethread的引數列表。
這兩種方法都需要利用拷貝建構函式將實參拷貝給形參,即這兩種方法都用到了thread類的拷貝建構函式。
報錯的原因用人話來說就是thread類沒有定義拷貝建構函式。我百思不得其解。
折騰了快兩個小時。突然福至心靈,想到了c++中右值的概念。對喲,以第一種方式將引數傳入scropethread的建構函式時,我在引數列表裡建立了乙個臨時的std::thread(fun),這是乙個右值。
而當我在外面這樣定義時: std::thread t1(fun);t1是乙個左值。
而錯誤的真正原因是:thread類沒有定義以左值作為引數的拷貝建構函式,但卻有以右值作為引數的拷貝建構函式。
點進thread類的標頭檔案,果然如此:
從頭檔案中,我們也可以得出乙個結論:thread物件是不能複製(copy)的,只能移動(move)。
c 關於拷貝建構函式的疑問
有一些博文提到,c 中的預設拷貝建構函式都是淺拷貝,即是通過該函式拷貝的物件只複製了原物件的指標 但我在qt上用以下 測試時,得到如下結果 include class a using namespace std int main int argc,char ar using namespace st...
關於c 的預設拷貝建構函式
copy constructor inside the c object model 是本非常好的書,特別是幫助對類的構造和析構的理解。下面我要是的乙個就是關於c 預設的拷貝建構函式 一般我們用到它在以下情況 class a a aa default ctor a a aa copy ctor vo...
C 中的拷貝建構函式
在c 中,下面三種物件需要呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另外乙個物件進行初始化 注意 1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。2.類中有指標型別的資料成員事就要呼叫自己...