2015-02-01 15 views
14

Tôi đã tìm thấy một hành vi kỳ lạ sử dụng đa hình C++ 14 lambdas (lambdas với auto trong các thông số của họ):Lỗi gcc có thể có với C++ 14 lambdas đa hình?


Snippet 0:

#include <iostream> 

template<typename T> void doLambda(T&& mFn) 
{ 
    std::forward<T>(mFn)(int{0}); 
} 

template<typename T> void test(T&& mV) 
{ 
    doLambda([&mV](auto mE) 
    { 
     std::forward<decltype(mV)>(mV); 
    }); 
} 

int main() { test(int{0}); return 0; } 

kêu vang ++ 3.5.1 : đoạn mã biên dịch và chạy thành công.

g ++ 4.9.2: đoạn thất bại trong việc biên dịch:

example.cpp: In instantiation of 'test(T&&)::<lambda(auto:1)> [with auto:1 = int; T = int]' :

5 : required from 'void doLambda(T&&) [with T = test(T&&) [with T = int]::]'
13 : required from 'void test(T&&) [with T = int]'
18 : required from here
12 : error: 'mV' was not declared in this scope

std::forward<decltype(mV)>(mV);
^

Compilation failed


Snippet 1:

Sự khác biệt duy từ đoạn 0 là auto bên trong lambda là được thay thế thành int.

#include <iostream> 

template<typename T> void doLambda(T&& mFn) 
{ 
    std::forward<T>(mFn)(int{0}); 
} 

template<typename T> void test(T&& mV) 
{ 
    doLambda([&mV](int mE) 
    { 
     std::forward<decltype(mV)>(mV); 
    }); 
} 

int main() { test(int{0}); return 0; } 

kêu vang ++ 3.5.1: đoạn biên dịch và chạy thành công.

g ++ 4.9.2: đoạn mã biên dịch và chạy thành công.


Snippet 3:

Lambda bây giờ được gọi tại chỗ. auto vẫn được sử dụng.

#include <iostream> 

template<typename T> void test(T&& mV) 
{ 
    [&mV](auto mE) 
    { 
     std::forward<decltype(mV)>(mV); 
    }(int{0}); 
} 

int main() { test(int{0}); return 0; } 

kêu vang ++ 3.5.1: đoạn biên dịch và chạy thành công.

g ++ 4.9.2: đoạn mã biên dịch và chạy thành công.


Tại sao g ++ phàn nàn về đoạn 0? Có gì sai trong mã của tôi không? Đây có phải là lỗi đã biết hay tôi nên gửi lỗi này không?

+0

Sao chép bằng [** GCC trên Coliru **] (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4) – Columbo

+4

Rõ ràng là một lỗi. Không sinh sản trên [thân] (http://melpon.org/wandbox/permlink/1FXFunvTq3KwqO8a), vì vậy tôi đoán nó được cố định. –

+0

@ T.C. bạn có thể gửi bình luận của bạn như là một câu trả lời để tôi có thể chấp nhận nó? –

Trả lời

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