Использование std:: необязательный для передачи std::vector<int> в функционал по ссылке
Мне неясно, является ли правильный код для передачи необязательного вектора целых в функцию по ссылке:
void test_func(std::optional<std::vector<int>&> vec)
или же
void test_func(std::optional<std::vector<int>>& vec)
Любая помощь высоко ценится.
3 ответа
Из того, что я знаю, это не возможно в стандарте, так как никто не согласился с последствиями назначения.
То, чего вы хотите достичь, возможно с помощью функции библиотеки:
void test_func(std::optional<std::reference_wrapper<std::vector<int>>> vec)
Ненужный указатель является обнуляемым ссылочным типом.
void test_func(std::vector<int>* vec)
Дополнительные ссылки не являются частью стандартной библиотеки в данный момент.
Оба в принципе имеют смысл.
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
передается по ссылке. Вы получаете доступ к тому же необязательному, который был передан, копирование не происходит.
Второй вариант более интуитивен и доступен в STL на данный момент, поэтому он предпочтительнее.