Я читал связанный вопрос, который заставляет меня задавать этот вопрос.
Рассмотрим следующий код
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() будет иметь область действия только в основном. Но я был неправ. Почему компилятор позволяет компилировать код, как указано выше? Существуют ли какие-либо ситуации в реальном времени, когда смысл кода, подобного приведенному выше, имеет смысл?
Любые мысли?