﻿# 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:

```cpp
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\-\>':

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