2015-02-01 2 views
14

나는 (자신의 매개 변수에 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 ++는 조각 공에 대해 불평? 내 코드에 이상이 있습니까? 이 버그는 알려진 버그입니까, 아니면 제출해야합니까?

+0

[** GCC on Coliru **] (http://coliru.stacked-crooked.com/a/428c36ca8344c8b4)로 재현 – Columbo

+4

분명히 버그입니다. [trunk] (http://melpon.org/wandbox/permlink/1FXFunvTq3KwqO8a)에서 재현하지 않으므로 수정 된 것 같습니다. –

+0

@ T.C. 동의 할 수 있도록 답변으로 의견을 게시 할 수 있습니까? –

답변