Я пытаюсь манипулировать std::optional
с помощью контейнера, например std::vector
.
Я начал с кода ниже:
#include <iostream>
#include <vector>
#include <string>
#include <optional>
using namespace std;
using optional_vecs = std::optional<std::vector<std::string>>;
optional_vecs returnStrings()
{
optional_vecs myVect(std::in_place);
myVect->emplace_back("Name");
return myVect;
}
int main()
{
for (auto e : returnStrings().value())
std::cout << e << " ";
return 0;
}
Проблема в том, что я ничего не получаю в выводе: я предполагаю, что, поскольку std::optional::value
возвращает ссылку, как в моем случае, это ссылка на временную.
Итак, чтобы решить, что я попытался использовать std::reference_wrapper
, как показано ниже:
using optional_vecs = std::optional<std::reference_wrapper<std::vector<std::string>>>;
optional_vecs returnStrings()
{
optional_vecs myVect;
myVect->get().emplace_back("Name");
return myVect;
}
Теперь у меня есть cra sh и ошибка:
- cra sh происходит при попытке добавить строку «name».
- error это когда я пытаюсь использовать
for-range
l oop, говоря the range for loop requires a suitable "begin" function and none was found.
Приведенный ниже код работает, но я не люблю объявлять переменную и затем вызывать Value ():
int main()
{
auto result = returnStrings();
for (auto e : result.value())
std::cout << e << " ";
return 0;
}
Так как я могу вернуть std :: опционально, удерживая std::vector
в пути functionName().Value()
.