Окрім того, що сказав відвідувач:
Функція, яку void emplace_back(Type&& _Val)
надає MSCV10, є невідповідною та зайвою, оскільки, як ви зазначили, вона суворо еквівалентна push_back(Type&& _Val)
.
Але справжня C ++ 0x форма emplace_back
дійсно корисна void emplace_back(Args&&...)
:;
Замість того, щоб приймати це, value_type
він бере різноманітний список аргументів, так що це означає, що тепер ви можете ідеально пересилати аргументи і конструювати безпосередньо об'єкт в контейнер без тимчасового взагалі.
Це корисно, оскільки незалежно від того, наскільки розумність RVO та семантичне переміщення принесуть до таблиці, все ще є складні випадки, коли push_back, ймовірно, робить непотрібні копії (або переміщення). Наприклад, з традиційною insert()
функцією a std::map
, ви повинні створити тимчасовий, який потім буде скопійовано в a 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);
Так чому вони не реалізували правильну версію emplace_back в MSVC? Насправді, це мене дуже непокоїло, тому я задав те саме питання у блозі Visual C ++ . Ось відповідь від Стефана Т Лававея, офіційного підтримувача стандартної бібліотеки Visual C ++ у Microsoft.
Питання: Чи функціонування бета-версії бета-2 зараз є якимось заповнювачем?
Відповідь: Як ви знаєте, варіативні шаблони не реалізовані у VC10. Ми імітуємо їх за допомогою препроцесорної техніки для речей, таких як
make_shared<T>()
, кортеж та нові речі <functional>
. Це препроцесорне обладнання порівняно важко у використанні та обслуговуванні. Також це суттєво впливає на швидкість компіляції, оскільки нам доводиться неодноразово включати підзаголовки. Через поєднання наших обмежень у часі та швидкості компіляції ми не моделювали різні шаблони в наших функціях.
Коли в компіляторі будуть реалізовані різні шаблони, ви можете сподіватися, що ми скористаємося ними в бібліотеках, в тому числі в наших функціях emplace. Ми ставимося до відповідності дуже серйозно, але, на жаль, не можемо зробити все все одночасно.
Це зрозуміле рішення. Кожен, хто лише раз намагався наслідувати різноманітний шаблон за допомогою жахливих хитрощів препроцесора, знає, наскільки огидними є цей матеріал.