Какая разница в результирующем бинарнике, когда мы сравниваем этот код:
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. Я хотел бы избежать этого, и мне интересно, могут ли лямбда-выражения помочь против раздувания кода шаблона. Определено ли это в стандарте или зависит от реализации компилятора?
auto
, как и для шаблонов.auto
не поддерживает динамическую типизацию. Это по-прежнему статически типизированный язык, и вам нужны разные версии для разных типов. Шаблоны, прочая магия компилятора - не имеет значения. - person 3Dave   schedule 13.09.2018