Какая разница в полученном двоичном файле при сравнении этого кода:
struct S {
template<typename... Args>
void operator()(Args... args) { /* ... */ }
};
// And then inside some block:
S s;
s(42);
s(3.14, "Hi!");
s("Hi!", 3.14);
... к этому коду:
const auto l = [](auto... args) { /* ... */ };
// And then inside some block:
l(42);
l(3.14, "Hi!");
l("Hi!", 3.14);
Насколько я понимаю, код struct
создает 3 экземпляра шаблона для operator()
, каждый из которых отображается в виде символов в двоичном файле. Что насчет лямбды? Компилятор создает объект, похожий на s
. Но если это безымянный тип класса, создает ли он символы в двоичном файле?
Мотивация: Я использовал библиотеку с большим количеством шаблонов, где мне пришлось включить / bigobj . Я хотел бы избежать этого, и мне интересно, могут ли лямбды помочь в борьбе с раздуванием кода шаблона. Это определено в стандарте или зависит от реализации компилятора?