Oprócz tego, co powiedział odwiedzający:
Funkcja void emplace_back(Type&& _Val)
zapewniana przez MSCV10 jest niezgodna i redundantna, ponieważ, jak zauważyłeś, jest ściśle równoważna z push_back(Type&& _Val)
.
Ale prawdziwa forma C ++ 0x emplace_back
jest naprawdę przydatna void emplace_back(Args&&...)
:;
Zamiast brać value_type
zmienną, bierze się listę argumentów, co oznacza, że możesz teraz idealnie przekazywać argumenty i konstruować bezpośrednio obiekt w kontenerze bez żadnych tymczasowych.
Jest to przydatne, ponieważ bez względu na to, jak sprytne RVO i semantyczne ruchy przynoszą do stołu, wciąż istnieją skomplikowane przypadki, w których push_back prawdopodobnie tworzy niepotrzebne kopie (lub ruchy). Na przykład, za pomocą tradycyjnej insert()
funkcji a std::map
, musisz utworzyć tymczasowy, który zostanie następnie skopiowany do a std::pair<Key, Value>
, który następnie zostanie skopiowany na mapę:
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);
Dlaczego więc nie wdrożyli właściwej wersji Situace_back w MSVC? Właściwie to też dawno mnie zepsuło, więc zadałem to samo pytanie na blogu Visual C ++ . Oto odpowiedź Stephan T. Lavavej, oficjalny opiekun implementacji standardowej biblioteki Visual C ++ w firmie Microsoft.
P: Czy funkcje umiejscawiania beta 2 są teraz teraz tylko jakimś symbolem zastępczym?
Odp .: Jak zapewne wiesz, szablony variadic nie są zaimplementowane w VC10. Symulujemy je za pomocą maszyn preprocesora do takich rzeczy, jak
make_shared<T>()
krotka i nowe rzeczy w <functional>
. Ta maszyna preprocesorowa jest stosunkowo trudna w użyciu i utrzymaniu. Ma to również znaczący wpływ na szybkość kompilacji, ponieważ musimy wielokrotnie dołączać podtytuły. Ze względu na połączenie naszych ograniczeń czasowych i problemów związanych z prędkością kompilacji nie symulowaliśmy szablonów variadic w naszych funkcjach lokalizacyjnych.
Kiedy szablony różnorodne są implementowane w kompilatorze, możesz oczekiwać, że skorzystamy z nich w bibliotekach, w tym w naszych funkcjach lokalizacyjnych. Bardzo poważnie podchodzimy do zgodności, ale niestety nie możemy zrobić wszystkiego naraz.
To zrozumiała decyzja. Każdy, kto choć raz próbował naśladować szablon variadic z okropnymi sztuczkami preprocesora, wie, jak obrzydliwe są te rzeczy.