Re[7]: v.emplace_back(v[0])
От: N. I.  
Дата: 11.10.17 15:57
Оценка: +1
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 неминуемо по-любому.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.