2016-07-06 5 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 На самом деле, он соответствует указателю конструктора перемещения – 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:

арг - список аргументов, с которым будет построен экземпляр Т.

+0

Почему не конструктор перемещения? – Curious

+0

@ Curious, похоже, вы получили свой ответ на вышеупомянутый вопрос. –