Что означает -> после прототипа функции?

Что происходит в этом коде? Это так запутанно.

#include 

struct check
{
   template 
   auto foo() -> decltype(std::declval().value, void())
   {
      static_assert(T{}.value == 10, "Incorrect value");
   }
} var;

int main()
{
   struct apple
   {
      int value{10};
   };

   var.foo();
}

В частности, часть, где он имеет-> и все после этого.

Ответы на вопрос(1)

Ваш ответ на вопрос