Рассмотрим следующее:
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Если перераспределение происходит в векторе, и что не выполняется (выбрасывание std::bad_alloc
), я "безопасен" или я пропущу int
?
С++ 11 23.3.6.5 [vector.modifier]/1 говорит:
Если исключение выбрано иначе, чем конструктор копирования, переместите конструктор, оператор присваивания или оператор присваивания перемещения
T
или любой из операцийInputIterator
, никаких эффектов нет.
что, по-видимому, указывает на то, что это потенциальная проблема. То есть, если "нет эффектов", тогда не было построено unique_ptr
, и поэтому поведение деструктора было бы опираться на delete
, чтобы указатель не возникал. (Это может означать, что emplace_back
должен быть запрещен для контейнеров unique_ptr
s)