OK,
ERROR
};
struct SResp
{
std::string m_msg;
StatusCode m_status;
};
SResp queryToTheMoon(size_t val)
{
std::stringstream ss;
for (size_t idx = 0; idx < val; ++idx)
{
ss << "[" << val << "]";
}
return { ss.str(), StatusCode::OK };
}
boost::optional<std::string> makeRequest(size_t val)
{
auto response = queryToTheMoon(val);
if (response.m_status == StatusCode::OK)
{
return response.m_msg;
}
else
{
return boost::none;
}
}
int main()
{
auto op = makeRequest(100);
if (op)
{
std::cout << op.value() << std::endl;
}
}
Братья по "оружию", кто подскажет какие тут есть проблемы?
А какие должны быть? И чем std::optional не угодил?
Зачем копия на строке auto response = queryToTheMoon(val);
это вроде NRVO и оно не гарантируется стандартом. поправьте если не так
Там нет ни того, ни другого, мы конструируем временный boost::optional<std::string> для которого работает RVO, но из копии строки
NRVO (named return value optimization) - это object foo() { object named_object; return named_object; } RVO (return value optimization) : object foo() { return object(); }
RVO: return { ss.str(), StatusCode::OK };
Да, я неправ, я тоже не туда посмотрел. Я про return response.m_msg в makeRequest, где копия всё ещё есть
Вот это интересно
Обсуждают сегодня