나는 C++ 초보자이며 완벽한 전달이 std::move
과 함께 어떻게 작동하는지 알고 싶습니다.완벽한 전달 및이 동작 내에서의 동작 이동 :
fillWithData
템플릿 함수를 사용하여 채울 std::vector<QueueData> queue()
을 정의합니다. 완벽한 포워딩을 공부하는 데 시간을 할애했기 때문에 먼저이 컨텍스트에서 move
동작이 무엇인지 알아 내기 위해 올바르게 이해했는지 확인해야합니다.
fillWithData
은 forward
덕분에 접힌 규칙을 통해 lvalue 또는 rvalue로 매개 변수를 처리 할 수있는 가변 템플릿 함수입니다. (Q1 -이 맞습니까?)
template< class Container, typename ... Args >
static void fillWithData(Container & oDataContainer,
Args&& ... args) // universal reference
{
typedef typename Container::value_type::element_type QueueDataPtr;
oDataContainer.emplace_back(std::forward<Args>(args)...);
}
이제 fillWithData
에 전달할 인수를 취할에서 개체 User usr
가 상상 :
내가 호출하면 fillWithData(queue, usr.getName(), usr.getEmail(), usr.getAddr())
가 emplace
다음을 수행합니다은 전화?
- 임시 QueueData 객체의 생성자.
- 벡터 내부에 실제로 할당 된 객체의 생성자 (임시로 정의 된 경우 생성자, 그렇지 않으면 복사 생성자)를 이동합니다.
- 임시 용 소멸자.
나는를 rvalue로 좌변을 처리 할 move
의 장점이 걸릴 수 최적화하려면 (Q2 - 좌변 usr.getName()
이다?) :
fillWithData(queue, std::move(usr.getName()), std::move(usr.getEmail()), std::move(usr.getAddr()))
이런 식으로
, (Q3)은 User
생성자로 직접 전달되는 값이며 벡터 내부에 직접 생성 된 새로운 객체입니까? 예를 들어, 난 그냥 fillWithData
에 대한 호출 후 usr.getName()
에 새 통화를 할 경우
또한 (Q4)는 데이터를 계속 사용할 수 있습니까? (나는 런타임 오류가있을 것 같아요).
마지막으로 (Q5) std::move
이 없으면 완벽한 전달을 구현하는 것이 합리적입니까?
감사합니다.
한 질문, 제발 엄지 손가락의 간단한 규칙이있다. 다섯이 아닙니다. –