Существует ли использование функций для функций внутри функций?

Мы можем объявлять функции внутри функций (мне нужна локальная переменная, но она анализирует как объявление функции):

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

Являются единственными причинами, потому что это делает парсер проще "и" потому что стандарт говорит так "

Да, в основном.

Все, что может быть объявлением функции, является объявлением функции.

К сожалению, это один из тех случаев "просто".