> 백엔드 개발 > C++ > C 14 컴파일러는 constexpr이 아닌 표준 라이브러리 함수를 `constexpr`로 적절하게 처리할 수 있습니까?

C 14 컴파일러는 constexpr이 아닌 표준 라이브러리 함수를 `constexpr`로 적절하게 처리할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-05 22:35:13
원래의
232명이 탐색했습니다.

Can C  14 Compilers Conformingly Treat Non-constexpr Standard Library Functions as `constexpr`?

constexpr이 아닌 표준 라이브러리 함수의 constexpr 처리를 위한 컴파일러 확장을 준수합니까?

C 11에서는 표준 초안이 표준 처리를 허용하는 것으로 나타났습니다. 라이브러리는 명시적으로 표시되지 않은 경우에도 constexpr로 작동합니다. 그러나 이 입장은 이후 진화했습니다.

C 14 Evolution

C 14에서는 비표준 필수 함수를 constexpr로 선언하면 안 된다고 명시적으로 명시하고 있습니다. 구현. 이는 C 14 초안 표준의 섹션 17.6.5.6에 요약되어 있습니다.

An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.
로그인 후 복사

이 결정은 특히 SFINAE 사용으로 인해 관찰 가능한 다른 동작으로 이어지는 구현 차이를 방지하기 위해 내려졌습니다.

GCC 구현

이전에 GCC는 특정 처리를 했습니다. 비-constexpr 표준 라이브러리는 이전 LWG 2013 제안 결의안을 기반으로 하는 constexpr로 작동합니다. 그러나 이 동작은 더 이상 C 14에서 준수하는 것으로 간주되지 않습니다.

엄격 모드에서 경고 부재

비준수에도 불구하고 GCC는 엄격한 준수 모드에서 경고를 생성하지 않습니다( -std=c 11 -현학적). 이는 향후 업데이트에서 해결될 실수일 가능성이 높습니다.

내장 면제

컴파일러 내장 함수에는 표준 라이브러리 함수와 동일한 규칙이 적용되지 않습니다. 따라서 다음과 같은 내장 함수를 사용하는 것이 적합하다고 간주되어야 합니다.

static constexpr double a = __builtin_cos(3.);
로그인 후 복사

결론

constexpr이 아닌 표준 라이브러리 함수를 constexpr로 처리하는 것은 현재 C 14의 부적합 확장. GCC는 이전 제안을 기반으로 C 11에서 이를 허용했지만 해결 시 이 확장은 제거되거나 현재 C 14 표준을 준수하도록 수정될 것으로 예상됩니다.

위 내용은 C 14 컴파일러는 constexpr이 아닌 표준 라이브러리 함수를 `constexpr`로 적절하게 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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