나는 (자신의 매개 변수에 auto
와 람다) 다형성 C++ 14 람다를 사용하여 이상한 행동을 발견했습니다C++ 14 다형성 람다에 gcc 버그가 있습니까?
발췌문 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; }
그 소리 ++ 3.5.1 : 스 니펫이 성공적으로 컴파일되고 실행됩니다.
g ++ 4.9.2는 :
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
니핏 1 : 니핏 컴파일 실패
니펫 0에서 유일한 차이점은 람다 내부 auto
이었다고이고 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; }
그 소리 ++ 3.5.1 : 코드 조각 컴파일하고 성공적으로 실행됩니다.
g ++ 4.9.2 : 스 니펫이 성공적으로 컴파일되어 실행됩니다.
은 발췌문 3 :
람다는 지금의 장소라고합니다. auto
이 여전히 사용됩니다.
#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; }
그 소리 ++ 3.5.1 : 코드 조각 컴파일하고 성공적으로 실행됩니다.
g ++ 4.9.2 : 스 니펫이 성공적으로 컴파일되어 실행됩니다.
왜 g ++는 조각 공에 대해 불평? 내 코드에 이상이 있습니까? 이 버그는 알려진 버그입니까, 아니면 제출해야합니까?
[** GCC on Coliru **] (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4)로 재현 – Columbo
분명히 버그입니다. [trunk] (http://melpon.org/wandbox/permlink/1FXFunvTq3KwqO8a)에서 재현하지 않으므로 수정 된 것 같습니다. –
@ T.C. 동의 할 수 있도록 답변으로 의견을 게시 할 수 있습니까? –