Özyinelemeli lambda fonksiyonları C 11
C 11 yeni duyuyorum. Aşağıdaki özyinelemeli lambda fonksiyonu yazıyorum, ama derleme değil.
sum.cpp
#include <iostream>
#include <functional>
auto term = [](int a)->int {
return a*a;
};
auto next = [](int a)->int {
return a;
};
auto sum = [term,next,&sum](int a, int b)mutable ->int {
if(a>b)
return 0;
else
return term(a) sum(next(a),b);
};
int main(){
std::cout<<sum(1,10)<<std::endl;
return 0;
}
derleme hatası:
vimal@linux-718q:~//09C /c Çalışma 0x/lambda>g -std=c sum.cpp 0x
sum.cpp: lambda fonksiyonu:
sum.:18:36 cpp: hata: ‘((<lambda(int, int)>*)this)-><lambda(int, int)>::sum
’ bir fonksiyonu olarak kullanılamaz
gcc sürümü
gcc sürümü 4.5.0 20091231 (deneysel) (GCC)
Ama eğer aşağıdaki gibi sum()
ilanı değiştirirsem çalışır:
std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) sum(next(a),b);
};
Birisi bu ışık atabilir misiniz?
CEVAP
Arasındaki fark hakkında düşünüyorumotosürüm ve tam olarak belirtilen tip versiyonu.otoanahtar kelime algılar onun türü ne olursa olsun bu başlatıldı, ama ne sen başlatılıyor bunu bilmek ne türü (bu durumda, lambda kapatma ihtiyacı olduğunu bu tür yakalama). Yumurta-tavuk sorunu gibi bir şey.
Diğer taraftan, bir tam olarak belirtilen işlev nesnenin türünü gerekmez "bilmek" bir şey hakkında ne olduğunu tayin olmak için, ve böylece lambda kapatılmasını olabilir aynı şekilde olması hakkında tam bilgi türleri kendi yakalamak.
Kodunuzu bu hafif bir değişiklik düşünün ve daha mantıklı olabilir:
std::function<int(int,int)> sum;
sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) sum(next(a),b);
};
Belli ki, bu işe yaramazoto. Lambda fonksiyonları gayet iyi (en azından onlarla bir deneyim var MSVC, yok) iş özyinelemeli tür kesmesi ile gerçekten uyumlu değiller.
Lambda fonksiyonları şablon olabilir m...
Lambda fonksiyonu Python özyinelemeli ...
Python kullanmak için daha çok tercih ...
Neden Lambda daha düz fonksiyonları da...
Geçiş için lambda ifade özyinelemeli C...