uzhas:
U>Есть требование к std::vector (и emplace_back и реаллокация под его контролем) выполнить контракт (в каком порядке и что он будет делать — его забота).
Что именно emplace_back должна выполнить? Operational semantics у emplace_back следующая:
Appends an object of type T constructed with std::forward<Args>(args)...
Вот, есть у нас, например, такой код:
#include <vector>
int main()
{
std::vector<int> v;
int i;
v.emplace_back(i);
}
Попытка создать
an object of type int constructed with std::forward<int &>(i) не cможет обойтись без вычисления lvalue-to-rvalue conversion над std::forward<int &>(i), а в соответствии с правилами С++17 [conv.lval]/3 и [dcl.init]/12 такое вычисление имеет своим результатом indeterminate value и ведёт к undefined behavior. Таким образом, в данном случае прямое выполнение operational semantics метода emplace_back подразумевает возникновение undefined behavior. Нарушили мы при этом какие-то коряво сформулированные куцые "предусловия" emplace_back или нет, тут особой роли не играет, — появление undefined behavior неминуемо по-любому.