Yes, it's needed. The full definition of base::LazyInstance is,

template <typename Type, typename Traits = DefaultLazyInstanceTraits<Type> >
class LazyInstance

DefaultLazyInstanceTraits will access the constructor function of VirtualRootProvider. However, as a singleton class constructor function of VirtualRootProvider have to be private. So, "DefaultLazyInstanceTraits" should be declared as friend structure.