Стандартная библиотека C ++ указана несколько странным образом.
Указывается, что говорит о том, что требует каждый метод и что гарантирует каждый метод.Он не указан, как в «vector является контейнером значений, которым он владеет», даже если это базовая абстракция real здесь.
Формально то, что вы делаете, безопасно не потому, что«вектор копирует», но поскольку ни одна из предпосылок любого из методов вектора std не нарушается в копии вектора std, которую возвращает ваша функция.
Аналогично, значения устанавливаются как определенные, потому чтопостусловий конструктора, а затем предварительных и постусловий конструктора копирования и / или правил "elision" prvalue C ++ 17.
Но пытаться рассуждать о коде C ++ таким способом - безумие.
Семантически std :: vector - это регулярный тип со семантикой значения, которому принадлежат его собственные элементы.Обычные типы можно копировать, и копии ведут себя нормально, даже если исходный объект уничтожен.
Если вы не сделаете std::vector<std::reference_wrapper<int>>
, вы в безопасности и небезопасны для справочной оболочки, потому что вы сохранили элементы, которые являютсяне обычные типы значений.