2010-07-01 18 views
9

Yakalama listesi boşsa, lambda işlevinin işaretçiyi işlevini bozması için bir yere okuyorum. Şimdi bulabildiğim tek referans n3052. G ++ (4.5 & 4.6) ile, lambda şablon kodu içinde beyan edilmedikçe, beklendiği gibi çalışır.İşaretli kodda lambda bozunumunu işlev işaretçisi mi çalıştırmalı?

void foo() { 
    void (*f)(void) = []{}; 
} 

Ama şablonlu zaman (foo aslında başka bir yerde denir ise) artık derleme değil:

Örneğin aşağıdaki kod derler yukarıdaki referans olarak

template<class T> 
void foo() { 
    void (*f)(void) = []{}; 
} 

, ı don Bu davranışın bir açıklamasını görmüyorum. Bu, g ++ 'nın geçici bir sınırlamasıdır ve eğer değilse, buna izin vermemek için bir (teknik) neden var mıdır?

+1

Not edindiğiniz N3052'nin gerçekten de C++ 0x FCD (N3092 5.1.2/6) içine dahil edildiğini unutmayın. Visual C++ 2010, dönüştürme işlemini hiç uygulamamaktadır (VC++ yayımlanmadan çok kısa bir süre önce standarda dahil edildiğinden, şaşırtıcı değildir). Microsoft Connect'te bir hata raporu gönderdim (bunun bir sonraki Visual C++ sürümüne kadar düzeltilmeyeceğini tahmin etmeme rağmen): https://connect.microsoft.com/VisualStudio/feedback/details/572138/visual -c-2010-değil-izin-dönüşüm-kaptansız-lambda-işlev-işaretçisi –

+0

Sadece bir FYI gibi: Yukarıdaki kod hiçbiri Intel C++ 11.1'de desteklenmez. –

+1

Zaten GCC'lerde bugtracker, Şu an doğrulanmadı: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –

cevap

3

Özellikle izin verilmeyecek bir sebep düşünemiyorum. Sanırım bu sadece g ++ 'nın geçici bir sınırlaması.

Ben de birkaç şey denedik: çalışır

template <class T> 
void foo(void (*f)(void)) {} 

foo<int>([]{}); 

. (foo parametreli değilse ama yok) değil

typedef void (*fun)(void); 

template <class T> 
fun foo() { return []{}; } // error: Cannot convert. 

foo<int>()(); 

.

Not: Yalnızca g ++ 4.5 sürümünde test ettim.

+0

Evet, ilk durumda, lambda, bir şablon işlevi tarafından kullanılmasına rağmen, kodun bir şablon olmayan bölümünde bildirilir. . Aynı sorun, lambda bir şablon sınıfında bildirildiğinde gerçekleşir. – rafak

İlgili konular