Home >Backend Development >C++ >Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?
Can Non-Constexpr Standard Library Functions Be Treated as Constexpr in GCC?
GCC compiles code that initializes static constexpr variables with non-constexpr standard library functions without issuing warnings, such as the functions in the example below:
#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); };
According to the C 11 and C 14 standards, non-constexpr functions cannot be used in constant expressions. However, GCC treats some built-in standard library functions as constexpr, even though they are not explicitly marked as such.
This behavior is a non-conforming extension in C 14. The draft C 14 standard prohibits implementations from declaring standard library function signatures as constexpr unless explicitly required.
In C 11, the consensus shifted from allowing this extension to prohibiting it. This is because different implementations treating functions differently could lead to divergence in behavior when using SFINAE.
GCC initially relied on an earlier proposed resolution of LWG issue 2013, which allowed implementations to declare any function as constexpr if it satisfied certain constraints. This is why GCC treats these functions as constexpr in strict conformance mode.
However, the resolution changed in C 14, and this extension is now considered non-conforming. GCC is expected to address this issue and either issue warnings or disable this behavior in strict conformance mode.
Note that compiler intrinsics are not covered by this issue, so using them in constexpr contexts should be allowed.
The above is the detailed content of Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?. For more information, please follow other related articles on the PHP Chinese website!