> 백엔드 개발 > C++ > GCC는 Constexpr 컨텍스트에서 Constexpr이 아닌 표준 라이브러리 함수를 허용합니까?

GCC는 Constexpr 컨텍스트에서 Constexpr이 아닌 표준 라이브러리 함수를 허용합니까?

Barbara Streisand
풀어 주다: 2024-11-29 20:03:12
원래의
368명이 탐색했습니다.

Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?

GCC에서 Constexpr이 아닌 표준 라이브러리 함수를 Constexpr로 처리할 수 있습니까?

GCC는 constexpr이 아닌 정적 constexpr 변수를 초기화하는 코드를 컴파일합니다. 예제의 함수와 같이 경고를 표시하지 않는 표준 라이브러리 함수 아래:

#include <cmath>

struct foo {
  static constexpr double a = std::cos(3.);
  static constexpr double c = std::exp(3.);
  static constexpr double d = std::log(3.);
  static constexpr double e1 = std::asin(1.);
  static constexpr double h = std::sqrt(.1);
  static constexpr double p = std::pow(1.3,-0.75);
};
로그인 후 복사

C 11 및 C 14 표준에 따르면 constexpr이 아닌 함수는 상수 표현식에 사용할 수 없습니다. 그러나 GCC는 일부 내장 표준 라이브러리 함수가 명시적으로 표시되지 않은 경우에도 constexpr로 처리합니다.

이 동작은 C 14의 부적합 확장입니다. C 14 표준 초안은 다음과 같은 구현을 금지합니다. 명시적으로 요구되지 않는 한 표준 라이브러리 함수 시그니처를 constexpr로 선언합니다.

C 11에서는 이 확장을 허용하는 것에서 금지하는 것으로 합의가 바뀌었습니다. 이는 함수를 다르게 처리하는 여러 구현이 SFINAE를 사용할 때 동작의 차이로 이어질 수 있기 때문입니다.

GCC는 처음에 LWG 문제 2013에 대해 이전에 제안된 해결 방법에 의존했습니다. 이 해결 방법은 구현이 특정 조건을 충족하는 경우 모든 함수를 constexpr로 선언할 수 있도록 허용했습니다. 제약. 이것이 GCC가 이러한 함수를 엄격한 적합성 모드에서 constexpr로 취급하는 이유입니다.

그러나 C 14에서는 해상도가 변경되었으며 이제 이 확장은 비준수로 간주됩니다. GCC는 이 문제를 해결하고 엄격한 적합성 모드에서 경고를 표시하거나 이 동작을 비활성화할 것으로 예상됩니다.

컴파일러 내장 기능은 이 문제에서 다루지 않으므로 constexpr 컨텍스트에서 사용하는 것이 허용되어야 합니다.

위 내용은 GCC는 Constexpr 컨텍스트에서 Constexpr이 아닌 표준 라이브러리 함수를 허용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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