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?
Sao chép bằng [** GCC trên Coliru **] (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4) – Columbo
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. –
@ 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ó? –