Почему я могу получить доступ к структуре, определенной внутри функции, извне функции через вывод типа возврата?

Я смотрел один из видео Джейсона Тернера, и я увидел, что вы можете определить тип внутри области функций и получить его вне этого объем через функцию возврата типа типа.

auto f()
{
    struct MyStruct
    {
        int n;
    };
    return MyStruct{};
}

int main()
{
   auto a = f().n;
   return a;
}

Почему это разрешено? Есть ли абзац в стандарте С++ 14, который позволяет это?

При попытке получить typeid из MyStruct с помощью clang в компилировать проводник я увидел на выходе сборки тип, отображаемый как f()::MyStruct, поэтому существует область видимости, но каким-то образом я могу получить доступ к MyStruct вне этой области. Это какая-то вещь ADL?

Ответ 1

Нет, нет ADL. Поскольку ваша единица перевода содержит определение структуры, нет проблем с доступом к ее членам.

Важным моментом является то, что типы действительно не существуют в областях: имена. И обратите внимание, что вам не нужно использовать идентификатор MyStruct вместо auto при объявлении a. Это имя недоступно, как должно быть. Однако, пока вы можете получить тип без использования недоступного имени, все в порядке.

В принципе, это вряд ли отличается от использования типа элемента private:

class X
{
  struct Hidden
  {
    int i;
  };

public:
  Hidden get() const { return {42}; }
};

int main()
{
  X x;
  auto h = x.get();
  assert(h.i == 42);
}