가끔씩 복사가 불가능한 객체 배열을 만들어야 할 때가 있습니다. 예 :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 */
이 기능이 사라진 이유가 있습니까? 위험할까요? 아니면 내가 보지 못하는 어떤 문제? 본질적으로, 이동이 한 다른 객체에 한 객체 상태의 전송은, 때문에 당신이 제안 무엇
하는 방법입니다 더 나은 "해결 방법"'될 것이다 : 지금, 당신은 당신이 이제까지 얻을 수 있도록 노력하겠습니다 수에 관계없이, 아마 확대됨에있다 한 번에 하나의 emplacing하여 해결할 수 있습니다, 때문에
std :: vector v; v.reserve (NUM_CORES); for (...) v.emplace_back (...);'. 포인터가 필요 없습니다. 대답은 아마 "아무도 이것을 제안하기 위해 귀찮게하지 않았기 때문에"입니다. –
stefan
이동 구성 또는 할당 후 rvalue 참조는 유효하지만 알 수없는 상태로 남습니다. 당신이 정말로 원하는 것은 emplace_back과 같은 가변 생성자를 가질 수 있어야한다는 것입니다. 그러나 r 값은 T 생성자 인수 중 하나가 rvalues 인 경우 다시 발생합니다. @stefan 해결 방법은 내가 일반적으로하는 일이다. – galop1n
Lol 하나의 원래 인수에서 여러 요소를 이동 구성하는 방법을 어떻게 제안합니까? –