2014-10-30 3 views
0

가끔씩 복사가 불가능한 객체 배열을 만들어야 할 때가 있습니다. 예 :std :: vector fill 생성자가 emplacement를 활성화하지 않는 이유는 무엇입니까?

std::vector<std::thread> thread_pool(NUM_CORES, std::thread(some_function)); 

편리합니다. 그러나 아쉽게도 std::vector 채우기 생성자는 R 값을 지원하지 않습니다. 그것은 다음과 같이 정의된다

vector( 
     size_type count, 
     const T& value, 
     const Allocator& alloc = Allocator() 
); 

그러나 가지고 매우 편리 이 될 것입니다 :

vector( 
     size_type count, 
     T&& value, 
     const Allocator& alloc = Allocator() 
); 

그런 다음 벡터가 필요한 버퍼 크기를 할당 내부적으로 수 있으며, 새로운 배치로 각 요소를 이동-구성 .

하지만 C++ 11 표준 (및 분명히 C++ 14 표준)은이 기능을 제공하지 않습니다. 이제 스레드가있을 때 다음과 같이 말하면됩니다 :

std::vector<std::unique_ptr<std::thread>> thread_pool(NUM_CORES); 
/* now loop over vector and initialize elements one by one */ 

이 기능이 사라진 이유가 있습니까? 위험할까요? 아니면 내가 보지 못하는 어떤 문제? 본질적으로, 이동 다른 객체에 객체 상태의 전송은, 때문에 당신이 제안 무엇

+2

하는 방법입니다 더 나은 "해결 방법"'될 것이다 : 지금, 당신은 당신이 이제까지 얻을 수 있도록 노력하겠습니다 수에 관계없이, 아마 확대됨에있다 한 번에 하나의 emplacing하여 해결할 수 있습니다, 때문에

std :: vector v; v.reserve (NUM_CORES); for (...) v.emplace_back (...);'. 포인터가 필요 없습니다. 대답은 아마 "아무도 이것을 제안하기 위해 귀찮게하지 않았기 때문에"입니다. – stefan

+4

이동 구성 또는 할당 후 rvalue 참조는 유효하지만 알 수없는 상태로 남습니다. 당신이 정말로 원하는 것은 emplace_back과 같은 가변 생성자를 가질 수 있어야한다는 것입니다. 그러나 r 값은 T 생성자 인수 중 하나가 rvalues ​​인 경우 다시 발생합니다. @stefan 해결 방법은 내가 일반적으로하는 일이다. – galop1n

+4

Lol 하나의 원래 인수에서 여러 요소를 이동 구성하는 방법을 어떻게 제안합니까? –

답변

4

은 가능하지 않습니다. N 개체를 동시에 한 상태에서 모든 상태로 이동하여 만들 수는 없습니다.

스타 게이트 (Stargate) 우주는 은하계를 동시에 모든 은하계의 문에 열 수있는 능력을 도입함으로써이 규칙을 위반했는데, 전혀 의미가 없으며 실제로 나를 괴롭혔다. 그 남자가되지 마!

벡터 생성자는 다음과 같이보고 :

template <typename T> 
template <typename Args...> 
std::vector<T>::vector(const size_t n, Args&&... args); 

중 & hellip하며 emplace 모델 일 다음, 나는 기존의 생성자의 투명한 수 모호한 과부하 감사를 쉽게 얻을 것이라고 걱정하지만 std::vector<T>입니다. 나는 이것이 정말로 필요하지 않다는 사실 외에도, 이것이 이루어지지 않은 이유라고 생각한다.

std::vector<std::thread> v; 
v.reserve(NUM_CORES); 
for (/*...*/) 
    v.emplace_back(/*...*/); 
관련 문제