Я читал связанный вопрос, который заставляет меня задавать этот вопрос.
Рассмотрим следующий код
int main()
{
    string SomeString();
}
Все говорит, что компилятор принимает это как прототип функции, а не как строковый объект. Теперь рассмотрим следующий код.
int main()
{
    string Some()
    {
        return "";
    }
}
Компилятор сказал, что это неверно, так как я предполагаю, что определение вложенных функций не разрешено. Если это не разрешено, то почему вложенные прототипы функций разрешены?. Это не дает никаких преимуществ, а не путает (или я не вижу здесь некоторых допустимых моментов?).
Я понял, что верно следующее.
int main()
{ 
  string SomeFun();
  SomeFun();
  return 0;
}
string SomeFun()
{
  std::cout << "WOW this is unexpected" << std::endl;
}
Это тоже сбивает с толку. Я ожидал, что функция SomeFun() будет иметь область действия только в основном. Но я был неправ. Почему компилятор позволяет компилировать код, как указано выше? Существуют ли какие-либо ситуации в реальном времени, когда смысл кода, подобного приведенному выше, имеет смысл?
Любые мысли?
