Существует ли использование функций для функций внутри функций?
Мы можем объявлять функции внутри функций (мне нужна локальная переменная, но она анализирует как объявление функции):
struct bvalue;
struct bdict {
bdict(bvalue);
}
struct bvalue {
explict operator bdict() const;
}
struct metainfo {
metainfo(bdict);
}
void foo(bvalue v) {
metainfo mi(bdict(v)); // parses as function declaration
metainfo mi = bdict(v); // workaround
// (this workaround doesn't work in the presence of explicit ctors)
}
Являются единственными причинами "потому что это упрощает синтаксический анализатор" и "потому что стандарт говорит так", или есть ли неявное использование для этого?
Ответы
Ответ 1
Это действительно вопрос C, потому что это поведение было унаследовано непосредственно из C (хотя в С++ из-за самого досадного разбора он получает гораздо больше давления).
Я подозреваю, что ответ (в контексте C, по крайней мере) заключается в том, что это позволяет вам раскрывать существование объявлений функций точно там, где они нужны. Возможно, это было полезно в первые дни C. Я сомневаюсь, что кто-то это делает, но для обратной совместимости он не может быть удален с языка.
Ответ 2
Полезно, если вам нужно использовать внешнюю функцию, имя которой будет противоречить внутренней (статической) функции или переменной в текущем блоке перевода (исходный файл). Например (глупо, но он получает точку):
static int read(int x)
{
return bar(x);
}
static int foo()
{
ssize_t read(int, void *, size_t);
read(0, buf, 1);
}
Ответ 3
Объявление функции внутри другой функции скрывает другие перегруженные функции. например Ошибка компилятора в строке 7
#include <iostream>
void f(int);
int main() {
void f(char *);
f(10); // Line 7
f("Hello world");
return 0;
}
void f(int a) {
std::cout << a;
}
void f(char *str) {
std::cout << str;
}
Ответ 4
Являются единственными причинами, потому что это делает парсер проще "и" потому что стандарт говорит так "
Да, в основном.
Все, что может быть объявлением функции, является объявлением функции.
К сожалению, это один из тех случаев "просто".