Почему функция, которая возвращает только лямбду с сохранением состояния, вообще компилируется в любую сборку?C++

Программы на C++. Форум разработчиков
Anonymous
Почему функция, которая возвращает только лямбду с сохранением состояния, вообще компилируется в любую сборку?

Сообщение Anonymous »

Следующая нешаблонная (или это?) функция, возвращающая неуниверсальную лямбду с сохранением состояния:

Код: Выделить всё

auto foo(double a) {
return [a](double b) -> double {
return a + b;
};
}
скомпилировано с помощью GCC или Clang. Почему?

Код: Выделить всё

foo(double):
ret
Я ожидаю, что он не генерирует никаких результатов.

Происхождение вопроса
Даже не помню, почему я начал писать фрагмент выше, но всё равно...
Сначала я думал, что его нужно скомпилировать во что-то немного более длинное, так как ожидал увидеть как минимум инструкцию add.
Но потом я понял, что foo выше, его нельзя просто скомпилировать отдельно в cpp, а затем связать с другим TU, где он используется, потому что я даже не могу написать объявление — только для него!
Итак, я дошел до того, что единственная причина написать эту функцию в файле без заголовка состоит в том, что она используется в этом файле без заголовка, и в этот момент есть компилятор, который предположительно может встроить ее, где бы она ни находилась. используется.
Но если это так, то зачем компилировать foo во что угодно, если это единственное, что есть в TU? Здесь не с чем ссылаться, так почему для этого вообще генерируется какой-то вывод?

Использование структуры +

Код: Выделить всё

operator()
ничего не меняет, так как это

Код: Выделить всё

struct Bar {
double a;
double operator()(double b) const {
return a + b;
}
};

Bar bar(double a) {
return Bar{a};
}
генерирует тот же ret-код, что также очевидно в ретроспективе, поскольку нет возможности даже связать эту функцию bar с другими TU, если Панель скрыта в файле cpp.


Подробнее здесь: https://stackoverflow.com/questions/790 ... -any-assem

Вернуться в «C++»