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
를 컴파일;YesTemplate
에error: a lambda expression may not appear inside of a constant expression
을 입력하십시오. - gcc : 모두 성공적으로 컴파일합니다.
- msvc : 충돌합니다.
- ICC : 충돌 (우리는 승자가!)
올바른 결과는 무엇입니까? 상수 표현식에서 단락 연산자의 거짓 분기에서 비 상수 표현식이 좋음을 제안하는 표준 언어가 있지만 IANALL을 참조하십시오.
크래시는 컴파일러가 충돌하거나 프로그램이 충돌 함을 의미합니까? – user4581301
최신 VC (19.12.something)에서 C++ 17로 설정하고 경고를 레벨 4로 설정하면 '+'에 모호한 연산자가 발생합니다 – SoronelHaetir
clang 버그처럼 보이지만 clang HEAD는 진단을 제공하지 않습니다 [ (https://wandbox.org/permlink/2I7TE8WOTzZvmeZC) 언어 [조건부 평가되지 않은 부분에서 램버를 지원합니다] (https://stackoverflow.com/q/22232164/1708801) –