> 백엔드 개발 > C++ > Untaken `constexpr if` 분기의 정적 어설션은 어떻게 되나요?

Untaken `constexpr if` 분기의 정적 어설션은 어떻게 되나요?

DDD
풀어 주다: 2024-11-27 14:50:14
원래의
741명이 탐색했습니다.

What Happens to Static Assertions in Untaken `constexpr if` Branches?

실패한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿