"if constexpr"의 거짓 분기가 컴파일되는 이유는 무엇입니까?
Aug 18 2020
컴파일하는 동안이 코드에서 오류가 발생하는 이유는 무엇입니까? " "에 대한 나의 지식 (또한 이 )은 블록이 컴파일되지 않아야 if constexpr
한다고 말합니다 else
.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
오류는 다음과 같습니다.
error: expected ‘,’ or ‘;’ before ‘}’ token
컴파일러 사용 : g ++ 버전 7.5.0
컴파일하는 동안 -std=c++17
플래그를 사용했습니다 .
추신 : 누락 된 ';' 의도적이며 else
컴파일 중인지 여부를 확인하기위한 것 입니다.
답변
7 cigien Aug 18 2020 at 20:13
여기에는 두 가지 별개의 관련 문제가 있습니다.
첫째, if constexpr
템플릿 내에서 분기를 조건부로 컴파일합니다. 템플릿 외부에서는 모든 분기가 컴파일되고 잘 구성되어야합니다.
둘째, 템플릿에서도 폐기 된 분기는 if constexpr
가능한 모든 인스턴스화에 대해 형식이 잘못 될 수 없습니다. 다음과 같은 이유로 귀하의 코드에는 해당되지 않습니다.
int b = 10
항상 잘못된 형식입니다 (누락으로 인해 ;
).
따라서 컴파일러는 컴파일 오류를 제공하는 데 정확합니다. 기술적으로 폐기 된 분기가 모든 인스턴스화에 대해 형식이 잘못된 경우 컴파일러는 컴파일러 오류를 제공 할 필요 가 없지만 코드는 여전히 잘못되었습니다.