2016-07-06 83 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,看起来你已经得到了你对上述问题的回答。 –