Re[5]: v.emplace_back(v[0])
От: uzhas Ниоткуда  
Дата: 09.10.17 08:42
Оценка: 1 (1) +1
Здравствуйте, rg45, Вы писали:

R>Это звучит резонно.


R>Я вижу, название принципа "nothing prohibits it" взято в кавычки в сообщении по ссылке. Это наводит на мысль, что где-то в природе существует отдельное описание этого принципа. Интересно было бы увидеть.


Я так рассуждаю:
для методов вектора (да и всех контейнеров) стандарт определяет несколько важных вещей:

(список с потолка)
это, по сути, декларация контракта.
Так вот для метода emplace_back (и многих других) не описано никаких ограничений. В том числе не написано "вот это не передавайте, иначе UB". Я это понимаю, как при "ненарушении" других правил языка (то есть где-то ранее не допущен UB) и при передаче некоторого валидного значения в emplace_back реализация STL соблюдет контракт и выполнит post-condtion и всю задекларированную логику.

Короче, если не нарушил pre-conditions, то все должно работать, даже если вставляемый элемент указывает внутрь контейнера (т.к. оговорок по этому поводу в стандарте нет).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.