Bunun nedeni lambdasların fonksiyon nesneleri olmasıdır, bu yüzden onları bir fonksiyon şablonuna iletmek özellikle o nesne için yeni bir fonksiyon başlatır. Derleyici böylece önemsiz bir şekilde lambda çağrısını sıralayabilir.
Öte yandan, işlevler için eski uyarı uygulanır: bir işlev işaretçisi işlev şablonuna geçirilir ve derleyiciler geleneksel olarak işlev işaretçileri aracılığıyla çağrıları satır içine almakta çok fazla sorun yaşarlar. Bunlar olabilir teorik olarak satır içine yerleştirilmiş, ancak çevredeki fonksiyonu yanı inlined yalnızca.
Örnek olarak, aşağıdaki işlev şablonunu göz önünde bulundurun:
template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
for (; begin != end; ++begin)
*begin = f(*begin);
}
Böyle bir lambda ile çağırmak:
int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });
Bu örneklemedeki sonuçlar (derleyici tarafından oluşturulur):
template <>
void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) {
for (; begin != end; ++begin)
*begin = f.operator()(*begin);
}
… Derleyici _some_lambda_type::operator ()aramaları önemsiz bir şekilde bilir ve sıraya koyabilir. (Ve işlevi diğer herhangi bir lambda mapile çağırmak, her bir lambda farklı bir türe sahip olduğu için yeni bir örnek oluşturur .)map
Ancak bir işlev işaretçisi ile çağrıldığında, örnekleme aşağıdaki gibi görünür:
template <>
void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
for (; begin != end; ++begin)
*begin = f(*begin);
}
… Ve burada fher çağrı için farklı bir adrese işaret eder mapve böylece, derleyici belirli bir işleve çözümlenebilmesi için fçevreleyen çağrı mapda satır içine alınmadığı sürece derleyici çağrıları satır içi yapamaz f.