방문자가 말한 것 외에도 :
void emplace_back(Type&& _Val)
MSCV10에서 제공하는 기능 은 규격에 맞지 않고 중복되어 있습니다 push_back(Type&& _Val)
.
그러나 실제 C ++ 0x 형식 emplace_back
은 실제로 유용합니다. void emplace_back(Args&&...)
;
대신 value_type
인수의 가변 목록을 취하므로 이제 인수를 완벽하게 전달하고 개체를 컨테이너없이 컨테이너에 직접 구성 할 수 있습니다.
RVO와 이동 의미가 테이블에 가져 오는 영리성에 관계없이 push_back이 불필요한 복사 (또는 이동)를 일으킬 가능성이 여전히 복잡한 경우가 있기 때문에 유용합니다. 예를 들어,의 전통적인 insert()
기능 std::map
을 사용하여 임시를 생성해야합니다. 임시 std::pair<Key, Value>
는으로 복사 된 다음지도로 복사됩니다.
std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";
// cross your finger so that the optimizer is really good
m.insert(std::make_pair(4, Complicated(anInt, aDouble, aString)));
// should be easier for the optimizer
m.emplace(4, anInt, aDouble, aString);
그렇다면 왜 MSVC에서 올바른 버전의 emplace_back을 구현하지 않았습니까? 사실, 너무 오래 전에 버그가 발생했기 때문에 Visual C ++ 블로그 에서 같은 질문을했습니다 . 다음은 Microsoft Visual C ++ 표준 라이브러리 구현의 공식 관리자 인 Stephan T Lavavej의 답변입니다.
Q : 베타 2 임베드 기능은 현재 일종의 자리 표시 자입니까?
A : 아시다시피, 가변 템플릿은 VC10에서 구현되지 않습니다. 우리는 make_shared<T>()
, 튜플 및의 새로운 것들을 위해 전 처리기 기계로 시뮬레이션합니다
<functional>
. 이 전 처리기 기계는 사용 및 유지 관리가 상대적으로 어렵습니다. 또한 서브 헤더를 반복적으로 포함해야하므로 컴파일 속도에 큰 영향을줍니다. 시간 제약과 컴파일 속도 문제의 조합으로 인해 우리는 emplace 함수에서 variadic 템플릿을 시뮬레이션하지 않았습니다.
variadic 템플릿이 컴파일러에서 구현되면 내장 함수를 포함하여 라이브러리에서 템플릿을 활용할 것으로 기대할 수 있습니다. 우리는 준수를 매우 중요하게 생각하지만 불행히도 모든 것을 한꺼번에 할 수는 없습니다.
이해할 수있는 결정입니다. 전 처리기 끔찍한 요령으로 다양한 템플릿을 에뮬레이션하려고 한 번만 시도한 사람은이 물건이 얼마나 역겨운 지 알고 있습니다.