Обращаясь к классу, определенному внутри области функций

В С++ 1y возможно, чтобы возвращаемый тип функции включал локально определенные типы:

auto foo(void) {
  class C {};
  return C();
}

Имя класса C не входит в область вне тела foo, поэтому вы можете создавать экземпляры класса, но не указывать их тип:

auto x            = foo(); // Type not given explicitly
decltype(foo()) y = foo(); // Provides no more information than 'auto'

Иногда желательно явно указать тип. То есть полезно написать "тип C, определенный в foo", а не "любой тип возврата foo". Есть ли способ явно записать тип возвращаемого значения foo?

Ответ 1

auto x            = foo(); // Type not given explicitly
decltype(foo()) y = foo(); // Provides no more information than 'auto'

И что? Почему вас интересует, что такое "настоящее" имя?

Как говорится в комментарии dyp, вы можете использовать typedef, чтобы дать ему имя, если это делает вас лучше, чем auto:

 using foo_C = decltype(foo());

Иногда желательно явно указать тип. То есть полезно написать "тип C, определенный в foo", а не "любой тип возврата foo". Есть ли способ явно написать тип возвращаемого значения foo?

Нет.

Нет имени для "области действия внутри foo()", так как нет имени для этих областей:

void bar()
{
  int i=0;
  // this scope does not have a name, cannot qualify `i`
  {
    int i=1;
    // this scope does not have a name, cannot qualify either `i`
  }
}