SORU
14 Ocak 2010, PERŞEMBE


Ö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
2 Kasım 2010, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • ThreadBanger

    ThreadBanger

    2 Mart 2007