關於C 中 thread 的拷貝建構函式

2022-03-11 03:17:21 字數 1176 閱讀 9630

起因來自於《c++併發程式設計實戰》的這樣乙個例子

#include #include 

#include

class

scropethread

}~scropethread()

scropethread(

const scropethread &) = delete

; scropethread& operator=(const scropethread &) = delete

;private

: std::thread m_pthead;

};void fun(void

){}int

main()

我「靈機一動」,將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.類中有指標型別的資料成員事就要呼叫自己...