Как вернуть необязательный указатель или ссылку (std :: option)? - PullRequest
0 голосов
/ 08 апреля 2020

Предположим, у меня есть следующая шаблонная функция:

template <typename T>
std::optional<std::reference_wrapper<const T>> larger(const T data[], size_t count) {
    if(!count) return std::nullopt;

    size_t index_max {};
    for(size_t i {1ULL}; i < count; ++i)
        index_max = data[i] > data[index_max] ? i : index_max;

    return std::optional< std::reference_wrapper<const T> > {&data[index_max]};
}

Я пытаюсь вернуть необязательную ссылку, но мне не удается это сделать. Я не уверен, что делать дальше. Это то, что я придумал, изначально то, что у меня было std::optional<const T*> в качестве возвращаемого типа.

1 Ответ

2 голосов
/ 08 апреля 2020

У вас есть "опечатка", она должна быть (без &):

return std::optional< std::reference_wrapper<const T> > {data[index_max]};

Демо

В качестве альтернативы, как вы указываете тип возврата ( для optional) вы можете использовать std::cref:

return std::cref(data[index_max]);

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...