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