Необязательные ссылки: на данный момент не входит в стандартную библиотеку .
В принципе оба имеют смысл.
void test_func(std::optional<std::vector<int>&> vec)
Здесь std::optional
передается по значению (копируется), и поэтому ссылка внутри него.Копирование ссылки означает, что она все еще указывает на старый объект.Это может привести к неожиданному поведению, поскольку есть два экземпляра std::optional
, указывающих на один и тот же std::vector
.
void test_func(std::optional<std::vector<int>>& vec)
Здесь std::optional
передается по ссылке.Вы получаете доступ к тому же необязательному, который был передан, копирование не происходит.
секунда одна более интуитивно понятна imho и в настоящее время доступна в STL, поэтому предпочтительнее .