Вернуть std :: nullopt как непостоянную ссылку - PullRequest
0 голосов
/ 19 марта 2019

Формируйте академическую точку зрения, если я хочу вернуть std :: nullopt в качестве непостоянной ссылки.Как я буду делать то же самое.

Небольшая предыстория, сегодня, когда я работал над кодом, возвращающим ссылку std :: option>, но я забыл сделать константу возврата и получил ошибку.

Error (active)    E0434   a reference of type "std::optional<std::vector<std::any, std::allocator<std::any>>> &" (not const-qualified) cannot be initialized with a value of type "const std::nullopt_t"
Socket.IO   D:\Hardware\Windows\Visual Studio\Socket.IO\Socket.IO\main.cpp  46  

Error C2440   'return': cannot convert from 'const std::nullopt_t' to 'std::optional<std::vector<std::any,std::allocator<_Ty>>> &'
Socket.IO   d:\hardware\windows\visual studio\socket.io\socket.io\main.cpp  46

Просто хотел узнать, хочет ли кто-то вернуть непостоянную ссылку, используя std :: option, как он это сделает.

Используемая платформа: Windows 10 Prox64

Среда разработки: Visual Studios 15.9.9

std::vector<int>> a;
std::optional<std::vector<int>>& test(int b)
{
    a.clear();
    a.push_back(b);
    if(b)
         return a;
    else
         return std::nullopt;
}

1 Ответ

6 голосов
/ 19 марта 2019

std::nullopt не является std::optional<std::vector<int>> (и не a), это объект, который имеет неявное преобразование в этот тип.

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

Я не уверен, что вы должны возвращать ссылку на необязательную, а скорее "необязательную ссылку". std::optional<std::vector<int> &> не является допустимым типом, но оба типа std::vector<int> * и std::optional<std::reference_wrapper<std::vector<int>>> являются таковыми, и они моделируют «необязательную ссылку».

...