2017-03-01 15 views
7

Kodu:Bir lambda'da dış etki alanına erişim, g ++ veya Visual mi, ne de doğru değil mi?

auto main() -> int 
{ 
    int b = 42; 
    auto lambasta = [&]() 
    { 
     using B_type = decltype(b); 
     return B_type{}; 
    }; 
    (void) lambasta; 
} 

MinGW g ++ 6.3.0 -std=c++14 -Wall -pedantic-errors ile hiçbir teşhis ile derler. Visual C++ 2015 Güncellemesi 3,

 
foo.cpp(6): error C2065: 'b': undeclared identifier 
+0

Derleme bile Clagg/gcc [Demo] için yakalama olmadan (http://coliru.stacked-crooked.com/a/002edb55e3a07e00). – Jarod42

+0

Yakalama listesinde '& b' çalışıyor mu? –

+0

@TheQuantumPhysicist: Evet, adın açık olarak yakalanması Visual C++ 'ın var olduğunu anlamasına yardımcı olur. Yani gerçek ODR isminin kullanımı (bahsetmeden önce). Maalesef bu, orijinal sorunum için bir geçici çözüm değil, adın makro argüman olarak sağlanan bir ifadede oluştuğu yerdir. –

cevap

1

Olası geçici çözüm ile derlenmeyecektir:

template<typename T> 
struct wrapper 
{ 
    using wrapped_t = T; 
}; 

auto main() -> int 
{ 
    int b = 42; 
    auto lambasta = [&, a = wrapper<decltype(b)>()]() 
    { 
     using B_type = typename decltype(a) ::wrapped_t; 
     return B_type{}; 
    }; 
    (void) lambasta; 
} 

GCC 6.3 ve MSVC 2015 tarihinde İşleri 3 yukarı

+0

Bunu sevdim ama zaten kodu yeniden yazmıştım. Heh. –

İlgili konular