# V830. Decreased performance. Consider replacing the use of 'std::optional::value()' with either the '*' or '->' operator.

Анализатор обнаружил фрагмент кода, в котором используется доступ к содержимому заведомо инициализированного 'std::optional' с помощью метода 'std::optional::value()'.

Рассмотрим пример:

    inline void LuaBlockLoader::loadColorMultiplier(
      BlockState &state, const sol::table &table) const
    {
      std::optional<sol::table> colorMultiplier = table["color_multiplier"];
      if (colorMultiplier != std::nullopt) {
        state.colorMultiplier(gk::Color{
          colorMultiplier.value().get<u8>(1),
          colorMultiplier.value().get<u8>(2),
          colorMultiplier.value().get<u8>(3),
          colorMultiplier.value().get<u8>(4)
        });
      }
    }

Данный метод добавляет накладные расходы на проверку содержимого: если объект класса 'std::optional' равен 'std::nullopt', то будет выброшено исключение 'std::bad_optional_access'. Если известно, что объект инициализирован, можно упростить и ускорить код при помощи перегруженных операторов 'std::optional::operator*' или 'std::optional::operator->':

    inline void LuaBlockLoader::loadColorMultiplier(
      BlockState &state, const sol::table &table) const
    {
      std::optional<sol::table> colorMultiplier = table["color_multiplier"];
      if (colorMultiplier != std::nullopt) {
        state.colorMultiplier(gk::Color{
          colorMultiplier->get<u8>(1),
          colorMultiplier->get<u8>(2),
          colorMultiplier->get<u8>(3),
          colorMultiplier->get<u8>(4)
        });
      }
    }