2016-07-06 16 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'の引数は、オブジェクトを構築するfoが使用されています。あなたのケースでは、コピーコンストラクタシグネチャと一致する一時的なものを渡しています。 – Arunmu

+0

@Arunmu実際には、移動コンストラクタの署名と一致します – UldisK

+0

@UldisK condition_variableのための 'move constructor 'はありません。 – Arunmu

答えて

9

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
の呼び出しで呼び出されていない理由です

なぜコンパイラは、私はSTDのコピーコンストラクタを呼び出すようにしようとしていますことを考えるん:: condition_variable? `

あなたが

を呼び出すときに、コンパイラが使用する何が
std::make_shared<std::condition_variable>(std::condition_variable{}) 

は、渡された引数をとるコンストラクタを使用します。この場合、コピーコンストラクタがそのコンストラクタです。 http://en.cppreference.com/w/cpp/memory/shared_ptr/make_sharedから

引数 - Tのインスタンスが構築されると引数のリスト。

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

std::condition_variable{}

+0

移動コンストラクタはなぜですか? – Curious

+0

@Curious、あなたは上記の質問に対するあなたの答えを得たようです。 –

関連する問題