"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

항상 잘못된 형식입니다 (누락으로 인해 ;).

따라서 컴파일러는 컴파일 오류를 제공하는 데 정확합니다. 기술적으로 폐기 된 분기가 모든 인스턴스화에 대해 형식이 잘못된 경우 컴파일러는 컴파일러 오류를 제공 할 필요 가 없지만 코드는 여전히 잘못되었습니다.