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 map
ile ç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 f
her çağrı için farklı bir adrese işaret eder map
ve böylece, derleyici belirli bir işleve çözümlenebilmesi için f
çevreleyen çağrı map
da satır içine alınmadığı sürece derleyici çağrıları satır içi yapamaz f
.