2016-07-06 40 views
3

如果之前已詢問過此問題,我無法在線找到它,我表示歉意。爲什麼編譯器認爲我試圖調用std::condition_variable的拷貝構造函數?創建條件變量的共享指針時的問題

#include <iostream> 
#include <utility> 
#include <vector> 
#include <memory> 
#include <condition_variable> 
using namespace std; 

class A { 
public: 
    A() = default; 
    A(A&&) = default; 
    A& operator=(A&&) = default; 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
}; 
int main() { 

    std::vector<std::shared_ptr<std::condition_variable>> m; 
    m.push_back(std::make_shared<std::condition_variable>(std::condition_variable{})); 

    // no complains here 
    std::vector<std::shared_ptr<A>> m_a; 
    m_a.push_back(std::make_shared<A>(A{})); 

    return 0; 
} 

我得到的錯誤是,我想使用的std::condition_variable刪除拷貝構造函數..我想什麼,我想問的是,爲什麼移動的構造是不符合make_shared

+1

「make_shared」的參數用於構造對象。在你的情況下,你傳遞一個臨時的匹配複製構造函數簽名。 – Arunmu

+0

@Arunmu實際上,它匹配移動構造函數signsture – UldisK

+0

@UldisK對於condition_variable沒有'移動構造函數'。 – Arunmu

回答

9

std::make_shared<std::condition_variable>(std::condition_variable{}) 

std::condition_variable{}創建std::condition_variable。這意味着std::make_shared將構造它的內部std::condition_variable與調用複製構造函數的傳遞參數。如果您需要默認構建的std::condition_variable,那麼您可以使用

std::make_shared<std::condition_variable>() 
+0

爲什麼不移動構造函數? – Curious

+3

@Curious它沒有移動構造函數。 – NathanOliver

+0

沒錯!我不知道爲什麼我混亂移動作業與移動建設 – Curious

4
該調用稱爲

爲什麼編譯器會認爲我試圖調用性病的拷貝構造函數:: condition_variable?`

這就是當你調用

編譯器將使用
std::make_shared<std::condition_variable>(std::condition_variable{}) 

std::make_shared使用任何將傳遞給它的參數的構造函數。在這種情況下,複製構造函數是唯一的。

http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared

ARGS - 與其中T的一個實例,將建造參數列表。

+0

爲什麼不移動構造函數? – Curious

+0

@Curious,看起來你已經得到了你對上述問題的回答。 –