2013-09-07 18 views
5

Bildiğimiz gibi, yakalamayan lambda funktörleri çalışma zamanında fonksiyon göstergelerine dönüştürülebilir, ancak derleme zamanı nasıl olur? Yani, aşağıdaki kodlara benzer bir şey mümkün mü? Lütfen, bir fonksiyon parametresi olarak lambda funkerini geçmek gibi bir geçici çözüm önermeyin, C++ 11 standardının nerede/nasıl olduğunu daha fazla bilmek isterim.lambda funküllerin fonksiyon göstergelerine derleme zamanı dönüşümü

template <void(*fptr)()> 
void f() 
{ 
    // do something 
} 

int main() 
{ 
    auto l([]{}); 

    f<(void(*)())(decltype(l))>(); 

    return 0; 
} 

gcc-4.8 ile zorunlu hatası: hatta boş bir kapatma ile

c.cpp: In function 'int main()': 
c.cpp:11:7: error: parse error in template argument list 
     f<(void(*)())(decltype(l))>(); 
    ^
c.cpp:11:36: error: statement cannot resolve address of overloaded function 
     f<(void(*)())(decltype(l))>(); 
            ^
+4

[expr.prim.lambda]/6 "Lambda-yakalama içermeyen bir genel olmayan lambda ifadesi için kapatma türü, işleve gösterici için açık const dönüştürme işlevine sahip olmayan bir sanal ortama sahiptir ... ] "ve" constexpr "olmak zorunda değil. – dyp

+0

@DyP aaahh, bir çalışma zamanı operatörü hatalı. Lütfen cevap olarak yapıştırın. – user1095108

+2

Biliyorsam * neden * 'constexpr' olması gerekmiyor, belki belki;) – dyp

cevap

2

Lambda ifadeleri, onlar sadece ne geçicileri çünkü şablon argümanı çalışması için bir işaretçi olarak kullanılamaz olabilir bazı işaretçiye işlevini dönüştür. Lambda ifadesi, bir lambda-ifadesinin değerlendirilmesinin bir geçici olarak sonuçlanmasıyla sonuçlanan geçici bir zamandır. [...] işlevi için bir işaretçi Dönüşüm Paragraf 6'da tarif edilecek olan

:

bir lambda yakalama ile bir lambda-ifadesi için kapalı tip bir halka sanal olmayan olmayan sahip -belirtici const dönüştürme işlevi aynı parametre ve geri dönüş türlerini kapatma türünün işlev çağrısı işleci olarak işlev görmek için işaretçi. Bu dönüşüm işlevi tarafından döndürülen değer, çağrıldığında, kapatma türünün işlev çağrısı işlecini çağırmakla aynı etkiye sahip olan bir işlevin adresi olacaktır. Bu, dönüşümün constexpr değerini vermemesidir ve bu nedenle, sonuç göstericisini şablon argümanı olarak işlev görmek için kullanma umudu yoktur.

Şu ana kadar bulabildiğim en iyi nedenlerden biri de N3597 adresinde yer alan ve N2895 numaralı sorulara işaret eden ve bu konuyla ilgili ayrıntılı bir tartışma bulamadığım bir ifadedir. Lambda ifadeleriyle yaratılan işlevler için ad-manganlamanın, belirli bağlamlarda kullanılmasını yasaklayan sorunlardan biri olduğu görülmektedir.

İlgili konular