2017-03-01 10 views
7

Code:Truy cập tên phạm vi bên ngoài trong một lambda, là g ++ hoặc Visual hay không, phải không?

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

Biên dịch không có chẩn đoán với MinGW g ++ 6.3.0 -std=c++14 -Wall -pedantic-errors. Thất bại trong việc biên dịch với Visual C++ 2015 cập nhật 3,

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

Compile ngay cả khi không chụp cho clagg/gcc [Demo] (http://coliru.stacked-crooked.com/a/002edb55e3a07e00). – Jarod42

+0

Có '& b' trong danh sách chụp không? –

+0

@TheQuantumPhysicist: Có, rõ ràng chụp tên giúp Visual C++ hiểu rằng nó tồn tại. Vì vậy, thực tế sử dụng ODR của tên (trước khi đề cập đến). Thật không may đó không phải là một giải pháp cho vấn đề ban đầu của tôi, nơi tên xuất hiện trong một biểu thức được cung cấp dưới dạng đối số macro. –

Trả lời

1

thể workaround:

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; 
} 

Hoạt động trên GCC 6.3 và MSVC 2015 lên 3

+0

Tôi thích điều đó nhưng tôi đã viết lại mã. Heh. –

Các vấn đề liên quan