첫째, 나는 this question을 알고 있지만, 나는 똑같은 것을 묻고 있다고 생각하지 않습니다.emplace_back 작업을 수행하기 위해 push_back을 오버로드 할 수없는 이유는 무엇입니까?
나는 무엇을 알고있다. std::vector<T>::emplace_back
은인데, 나는 왜 그것을 push_back()
이상으로 사용하는지 이해한다. 가변 인자 템플릿을 사용하여 여러 인자를 새 요소의 생성자에 전달할 수 있습니다.
그러나 C++ 표준위원회에서 새 구성원 기능이 필요하다고 판단한 이유는 무엇인지 이해할 수 없습니다. 단순히 push_back()
의 기능을 확장 할 수없는 이유는 무엇입니까? 정상를 rvalue를 호출하거나 것 인수를 포함, 당신은 N 인수를 전달할 수 있도록하면서
template <class... Args>
void push_back(Args&&... args);
이, 이전 버전과의 호환성이 손상되지 : 최대한 멀리 볼 수있는, push_back
는로 C++ 11에 과부하가 될 수있다 복사 생성자. 사실, push_back()
의 GCC C++ (11) 구현은, 어쨌든 emplace_back 호출
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
그래서, 내가 그것을 볼 수있는 방법은 emplace_back()
필요가 없다. 추가 할 필요가 있던 것은 모두 가변 인수를받는 push_back()
에 대한 오버로드였으며 인수를 요소 생성자에 전달합니다.
내가 틀렸어? 여기에 완전히 새로운 기능이 필요한 몇 가지 이유가 있습니까?
이 비슷합니다 http://stackoverflow.com/questions/4303513/push-back-vs-emplace-back – moka
좋은 질문을. @moka 그는 두 함수의 차이점을 알고 있습니다. 그는 심지어 그 특별한 질문과 관련이 있습니다. –
그들은 서로 다른 의미를 가지고 있습니다. 예를 들어'벡터 v;'에 대해'v.emplace_back (123)'과'v.push_back (123)'을'int'에서 암시 적으로 변환하여 비교하십시오. –