2017-12-19 25 views
8

다음 결과를 혼합하여 다음 C++ 11 코드를 컴파일하려고했습니다.분기의 람다는 상수 표현을 취하지 않았습니다. 누가 맞습니까?

struct NoTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

NoTemplate no_inst; 


template<typename> 
struct YesTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

YesTemplate<float> yes_inst; 
  • 그 소리는 : 성공적으로 NoTemplate를 컴파일; YesTemplateerror: a lambda expression may not appear inside of a constant expression을 입력하십시오.
  • gcc : 모두 성공적으로 컴파일합니다.
  • msvc : 충돌합니다.
  • ICC : 충돌 (우리는 승자가!)

올바른 결과는 무엇입니까? 상수 표현식에서 단락 연산자의 거짓 분기에서 비 상수 표현식이 좋음을 제안하는 표준 언어가 있지만 IANALL을 참조하십시오.

+3

크래시는 컴파일러가 충돌하거나 프로그램이 충돌 함을 의미합니까? – user4581301

+0

최신 VC (19.12.something)에서 C++ 17로 설정하고 경고를 레벨 4로 설정하면 '+'에 모호한 연산자가 발생합니다 – SoronelHaetir

+2

clang 버그처럼 보이지만 clang HEAD는 진단을 제공하지 않습니다 [ (https://wandbox.org/permlink/2I7TE8WOTzZvmeZC) 언어 [조건부 평가되지 않은 부분에서 램버를 지원합니다] (https://stackoverflow.com/q/22232164/1708801) –

답변

0

이 프로그램의 형식은 올바른 형식입니다.

참고 C++ 17 이후에는 람다식이 평가 되더라도 코어 상수 식에서 허용 될 수 있습니다. 자세한 내용은 제안 된 논문 N4487을 참조하십시오.