Использование 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 на данный момент, поэтому он предпочтительнее.

Другие вопросы по тегам