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

The analyzer has detected a block of code where the 'std::optional::value()' method is used to access the contents of an 'std::optional' object that is known to have been initialized.

Consider the following contrived example:

    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)
        });
      }
    }

This method adds an overhead for checking the contents: if an object of class 'std::optional' is found to be equal to 'std::nullopt', an 'std::bad_optional_access' exception will be thrown. If the object is known to be already initialized, the code can be simplified and speeded up by using the overloaded operator 'std::optional::operator*' or '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)
        });
      }
    }