2014-12-14 2 views
8

코드가 컴파일되어 예상대로 작동합니다. 구조 (클래스) Astd::thread에서 파생되며 int으로 확장됩니다. main 코드는 일부 스레드를 생성 한 후 완료 될 때까지 기다립니다.오류 : 삭제 된 함수 'std :: thread :: thread (const std :: thread &)'사용

error: use of deleted function ‘std::thread::thread(const std::thread&)'

을 나는 이유에 아무 생각이 :

문제는 소멸자 주석 (~A(){}) 때 코드가 구조체 A에서 소멸자없이 컴파일하는 동안 얻을 것입니다.

게다가 나는 왜 코드가 push_backemplace_back과 함께 작동하는지 이해하지 못하는 반면, 내가 이해하는 바에 따르면 push_back과 작동해서는 안됩니다. 당신이 소멸자를 원하는 경우

#include <iostream> 
#include <thread> 
#include <vector> 

struct A : std::thread { 
    int i; 
    A(void f(const char*),const char* s,int i_) : std::thread{f,s},i{i_}{ 
     std::cout<<"A created"<<std::endl; 
    } 
    //~A(){} // uncomment to see error 
}; 

void dosomething(const char* s){ 
    std::cout<<s<<std::endl; 
} 

int main(){ 
    std::vector<A> aa; 
    aa.emplace_back(&dosomething,"hi people",3434); 
    aa.push_back(A(&dosomething,"hi again people",777)); 
    aa.emplace_back(&dosomething,"hi again people",777); 
    aa.push_back(A(&dosomething,"hi again people",777)); 

    for(auto& i:aa) i.join(); 
} 
+0

컴파일러 버전 및 옵션은 무엇입니까? 컴파일러 버그 일 수 있습니다. – cdhowie

+0

그것이'push_back'과 함께 작동하는 이유에 관해서는, 당신의 구조체'A'가 move 생성자의 자동 생성에 적합하다고 믿습니다. 그래서'push_back'은 당신이 전달하는 임시적인 것에서 벡터의'A'를 움직일 것입니다 (push_back (value_type &&) 오버로드가 있음을주의하십시오) – cdhowie

+0

-g; -O0; -Wall; -std = C++ 14; -pthread는 g ++와 clang ++을 사용하고 -std = c + +11 – user3723779

답변

9

, 당신은 암시 적 이동의 ctor를 복원하는

A(A &&) = default; 

를 추가하여 코드를 수정할 수 있습니다.


첫 번째 문제는 사용자 정의 소멸자를 추가하면 이동 생성자의 암시 적 발전을 불가능하게한다는 것이다.

std::thread은 의도적으로 복사 할 수 없기 때문에 이동하지 못하고 복사 할 수없는 유형을 복사하려는 STL이 있습니다 (오도 된 오류).

암시 적으로 선언 된 이동 생성자에 대한 cppreference page의 섹션을 참조하고 관련 동기에 대해서는 other question을 참조하십시오.

혼란의 두 번째 원인은 push_back에 이동 오버로드가 있으므로 원래 코드가 처음에는 복사되지 않고 이동 만하는 것입니다. 이것을 증명하려면 dtor를 다시 주석으로 처리하여 다시 작동하게하고 push_backA에 대한 const 참조를 시도하십시오. 복사본 생성자에 대해 불평 할 것입니다. 즉, 다른 하나는 push_back 호출이이를 사용하지 않는다는 의미입니다.

관련 문제