Использование std :: необязательно для передачи std :: vector <int>в функционал по ссылке - PullRequest
0 голосов
/ 09 декабря 2018

Мне неясно, правильный ли код для передачи необязательного вектора целых чисел в функцию по ссылке:

void test_func(std::optional<std::vector<int>&> vec)

или

void test_func(std::optional<std::vector<int>>& vec)

Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Ненужный указатель является недействительным ссылочным типом.

void test_func(std::vector<int>* vec)
0 голосов
/ 09 декабря 2018

Насколько мне известно, в стандарте это невозможно, поскольку никто не согласился с последствиями назначения.

То, чего вы хотите достичь, возможно с помощью функции библиотеки:

  void test_func(std::optional<std::reference_wrapper<std::vector<int>>> vec)
0 голосов
/ 09 декабря 2018

Необязательные ссылки: на данный момент не входит в стандартную библиотеку .

В принципе оба имеют смысл.

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, поэтому предпочтительнее .

...