Почему функция, которая возвращает только лямбду с сохранением состояния, вообще компилируется в любую сборку?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++»