Если я правильно понимаю, в следующей функции есть неопределённое поведение из-за неопределённого порядка вычисления аргументов функции:
enum class OkFail
{
Fail,
Ok
};
template<class T, typename... TNames>
auto GetObjectProps(const T& jsnObject, const TNames&... strName)
{
const auto itEnd = jsnObject.end();
OkFail result = OkFail::Ok;
auto fnFind = [&result, &jsnObject, &itEnd](const auto& name)
{
const auto it = jsnObject.find(name);
if ( itEnd == it )
{
result = OkFail::Fail;
out::error() << "decodor: the received message is lacking of the data: " << std::string_view(name.data(), name.size());
}
return it;
};
return std::make_tuple(result, fnFind(strName)...); // TODO UB here, fix me.
}
Есть элегантный способ это исправить?