실패한 Constexpr if 블록의 정적 어설션
소개
constexpr(C 17에 도입된 경우) 더욱 간결하고 효율적인 코드를 만들 수 있습니다. 그러나 이는 또한 이러한 if 블록에서 static_assert 문 처리에 관한 질문을 제기합니다.
사용하지 않은 분기에서 정적 어설션 실패
표준 텍스트에는 static_assert constexpr if 문의 사용되지 않은 분기에서 문 형식이 잘못되었습니다. 이는 조건이 종속되는지 여부에 관계없이 적용됩니다.
기본 규칙
이 금지 사항은 템플릿에 대해 잘 확립된 규칙을 기반으로 합니다. 템플릿에 대해 유효한 특수화를 생성할 수 없는 경우 잘못된 형식의 NDR(진단이 필요하지 않음)입니다. 거짓으로 평가되는 비의존적 조건을 갖는 Static_assert가 이 범주에 속합니다.
안전성과 유용성에 대한 영향
이러한 제한은 다음과 같은 경우 constexpr의 안전성과 유용성에 상당한 제약을 가합니다. . 개발자는 if 문의 non-taken 분기 내에서 호출될 수 있는 잠재적인 static_assert를 알고 있어야 합니다.
예
다음 코드는 경고 없이 컴파일되지만 잘못된 형식으로 간주되는 경우:
template< typename T> constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); }
규칙
static_asserts에 대한 금지는 호출 그래프까지 확장되므로 static_asserts를 포함할 수 있는 non-taken 브랜치 내에서 호출되는 모든 함수도 금지됩니다.
결론
constexpr if 문의 사용되지 않은 분기에서 static_asserts의 실패는 다음을 강조합니다. 템플릿 내에서 사용할 때는 신중하게 고려해야 합니다. 개발자는 false로 평가되는 비종속 조건이 있는 static_assert가 if 문의 비사용 분기에서 시도되지 않도록 해야 합니다.
위 내용은 Untaken `constexpr if` 분기의 정적 어설션은 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!