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?
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 –
Sadece bir FYI gibi: Yukarıdaki kod hiçbiri Intel C++ 11.1'de desteklenmez. –
Zaten GCC'lerde bugtracker, Şu an doğrulanmadı: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –