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